2010-08-05 15 views
5

¡Silencio mortal! No muchas veces lo experimentas en Stackoverflow ... ¡He añadido una pequeña recompensa para que todo funcione!¿Cómo modifico una cadena json grande?

He creado un documento json que contiene información sobre la ubicación de varios países. He agregado algunas teclas personalizadas. Este es el comienzo de la JSON-archivo:

{ 
    "type": "FeatureCollection", 
    "features": [ 
     { "type": "Feature", "properties": { 
      "NAME": "Antigua and Barbuda", 
      "banned/censored": "AG", 
      "Bombed": 29, 
      "LON": -61.783000, "LAT": 17.078000 }, 
    "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -61.686668,... 

Todas las teclas personalizadas (como bombardeado, etc. prohibido/censurado) tienen valores, pero son simplemente vieja (falsa si quieres) valores. Los valores reales se guardan en un archivo .csv extraído de un documento de Excel.

I ej. tener esto:

      banned/censored  bombed 
Antigua and Barbuda    2     120 
... 

Ahora quiero hacer coincidir estos valores con la clave adecuada en el archivo json. ¿Hay algún programa por ahí que pueda usar? Otra opción sería una biblioteca json para Java, que de alguna manera admite lo que quiero. Aún no he podido encontrar una solución fácil. ¡El documento es bastante grande ~ 10MB, si hace alguna diferencia!

EDITAR: He usado QGIS para manipular el archivo .shp, por lo que también podría ser útil algún tipo de extensión.

Respuesta

7

Simplemente convierta el JSON y el CSV en un objeto de Java de pleno valor. De esta forma puede escribir cualquier lógica de Java a su gusto para alterar los objetos de Java dependiendo de uno u otro. Finalmente, convierta el objeto Java modificado que representa los datos JSON a una cadena JSON.

Sin embargo, hay un problema en su JSON. El / en banned/censored no es un carácter válido para un nombre de campo JSON, por lo que muchos de los deserializadores JSON existentes pueden ahogarse con esto. Si arreglas esto, entonces podrás usar uno de ellos.

Puedo recomendar el uso de Google Gson para la conversión entre JSON y Java. He aquí un ejemplo patada de salida en función de su estructura JSON (con banned/censored renombrado a bannedOrCensored):

class Data { 
    private String type; 
    private List<Feature> features; 
} 

class Feature { 
    private String type; 
    private Properties properties; 
    private Geometry geometry; 
} 

class Properties { 
    private String NAME; 
    private String bannedOrCensored; 
    private Integer Bombed; 
    private Double LON; 
    private Double LAT; 
} 

class Geometry { 
    private String type; 
    private Double[][][][] coordinates; 
} 

Sólo es necesario añadir/generar captadores y definidores mismo. A continuación, será capaz de convertir entre JSON y Java LIKE:

Data data = new Gson().fromJson(jsonString, Data.class); 

para convertir entre CSV y un objeto de Java, sólo debes elegir uno de los muchos programas de análisis CSV, como OpenCSV. Incluso puedes encargar tu propia casa con la ayuda de BufferedReader.

Finalmente, después de modificar el objeto de Java que representa los datos JSON, se puede convertir de nuevo a cadena JSON con la ayuda de Gson de la siguiente manera:

String json = new Gson().toJson(data); 
+0

Esto era lo que esperaba evitar. De todos modos, lo intentaré. ¡Gracias! –

+0

¿Qué tienes en mente? Algo de magia? – BalusC

+2

Un programa que admite algunas de las funciones que estoy buscando. Como una extensión de QGIS, o lo que sea, como magia. De todos modos, tienes las cosas en marcha. –

3

Si bien la respuesta de BalusC te dice cómo hacerlo en su actual configuración, tengo una sugerencia más radical: deshacerse de la JSON.

Por idea JSON no está destinado a almacenar datos: está destinado a ser utilizado como un "estándar abierto basado en texto ligero diseñado para el intercambio de datos legibles por humanos".Es decir: (datos tan poco no significativas como sea posible)

  • bajo tráfico
  • legible
  • fácil de manejar con lenguajes dinámicos

almacenes de datos, por otro lado tienen muchos más requisitos que esto. Es por eso que existen las bases de datos. Así que mueva su almacenamiento a una base de datos. Si no desea una base de datos con todas las funciones, use algo como HSQLDB o JavaDB.

+0

Tienes razón. No me gusta JSON para el almacenamiento de datos. Pero mientras trabajaba con archivos OpenLayers y .shp, pensé que era el formato más fácil de usar, ya que OpenLayers usa geojson y los archivos .shp se pueden convertir a geojson a través de gdal. –

Cuestiones relacionadas