2010-03-22 13 views
15

¿Alguien sabe una biblioteca de Java que podría codificar fácilmente Java Maps en objetos json y al revés?Biblioteca para codificar/decodificar desde json a java.util.Map?

ACTUALIZACIÓN

Por razones que no podrían explicar (y odio a veces) no puedo usar los fármacos genéricos en mi entorno.

Lo que estoy tratando de hacer es tener algo como esto:

Map a = new HashMap(); 
a.put("name", "Oscar"); 

Map b = new HashMap(); 
b.put("name", "MyBoss"); 
a.put("boss", b) ; 


List list = new ArrayList(); 
list.add(a); 
list.add(b); 


String json = toJson(list); 
// and create the json: 
/* 
    [ 
     { 
     "name":"Oscar", 
     "boss":{ 
       "name":"MyBoss" 
     } 
     }, 
     { 
      "name":"MyBoss" 
     } 
    ] 

    */ 

y ser capaz de volver a tenerlo como una lista de mapas

List aList = (List) fromJson(jsonStirng); 
+0

Ver también: http://stackoverflow.com/questions/338586/a-better-java-json-library –

+0

Ver también http: // stackoverflow .com/questions/443499/json-to-map y http://stackoverflow.com/questions/1957406/generate-java-class-from-json y http://stackoverflow.com/questions/658936/is-here -a-library-to-convert-java-pojos-to-and-from-json-and-xml –

+0

@dma_k Gracias por la referencia. De hecho necesito algo así como el último porque no tenía la intención de unirme a un frijol. – OscarRyz

Respuesta

14

JSON-Simple parece relativamente fácil de usar (ejemplos a continuación).

Mapa de JSON:

Map map = new HashMap(); 
    map.put("name", "foo"); 
    map.put("nickname", "bar"); 
    String jsonText = JSONValue.toJSONString(map); 

JSON para la lista/Mapa:

String s = yourJsonString; 
    List list = (JSONArray) JSONValue.parse(s);  
    Map map = (JSONObject) list.get(0); 
+0

Este hizo el trabajo. Gson me gusta más para enlazar frijoles, pero desafortunadamente en mi entorno no puedo usar genéricos en los que Gson confía mucho. JSON-Simple tiene un pequeño error que creo que podría resolverse fácilmente: http://code.google.com/p/json-simple/issues/detail?id=18 Estoy usando esto de todos modos, gracias por el enlace – OscarRyz

+0

Por lo que vale, no creo que tengas que usar genéricos ni siquiera con GSON. Estoy bastante seguro de que también funcionaría. – StaxMan

+0

Muchas gracias después de horas de búsqueda recibí una respuesta –

33

Usted puede utilizar Google Gson para eso. Tiene soporte excelente para Generic types.

He aquí un SSCCE:

package com.stackoverflow.q2496494; 

import java.util.LinkedHashMap; 
import java.util.Map; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class Test { 

    public static void main(String... args) { 
     Map<String, String> map = new LinkedHashMap<String, String>(); 
     map.put("key1", "value1"); 
     map.put("key2", "value2"); 
     map.put("key3", "value3"); 
     Gson gson = new Gson(); 

     // Serialize. 
     String json = gson.toJson(map); 
     System.out.println(json); // {"key1":"value1","key2":"value2","key3":"value3"} 

     // Deserialize. 
     Map<String, String> map2 = gson.fromJson(json, new TypeToken<Map<String, String>>() {}.getType()); 
     System.out.println(map2); // {key1=value1, key2=value2, key3=value3} 
    } 

} 
+0

¿Hay alguna manera de descodificar (deserializar) en un mapa no genérico? – OscarRyz

+0

Reemplace 'Map ' por 'Map ' o 'Map '. O, más amigable para OO, solo usa un Javabean completo. Gson también puede manejarlo perfectamente. Vea esta respuesta para un ejemplo: http://stackoverflow.com/questions/1688099/converting-json-to-java/1688182#1688182 – BalusC

+0

El problema es que estoy usando un entorno que no admite genéricos, (erhmm. no me pregunten cómo ni por qué, simplemente no puedo usarlos) y lo que estoy tratando de encontrar es una forma de convertir listas simples de mapas a json y recuperarlos. – OscarRyz

4

Usted puede ver el sitio desde Json.org para la lista de buenas bibliotecas JSON en Java.

JSon.org propio implementationJSONObject puede hacer precisamente eso. de sus Javadoc

/** 
    * Construct a JSONObject from a Map. 
    * 
    * @param map A map object that can be used to initialize the contents of 
    * the JSONObject. 
    */ 
    public JSONObject(Map map); 

que puede hacer

JSONObject json = new JSONObject(map); 

Para convertir JSON Cadena de nuevo a objetar ....

String jsonString = "{\"name\" : \"some name\", \"age\" : 10}"; 
JSONObject json = new JSONObject(jsonString); 

y se puede acceder a los valores como:

int age = json.getInt("age"); 

Constr uctor JavaDoC

Construya un JSONObject a partir de una fuente cadena de texto JSON. Este es el constructor de JSONObject más utilizado.

Parámetros: Fuente Una cadena que comienza con { (llave izquierda) y terminando con } (llave derecha).

+0

Esto va desde Mapa -> JSONObject, pero el interlocutor quiere ambas direcciones. – ThomasW

3

Supongo que la verdadera pregunta sería qué biblioteca JSON (desde la página de org.json) NO permitiría hacer esto.Hasta donde yo sé, cada biblioteca en particular lo permitiría de alguna forma. Así que cada biblioteca mencionada hasta ahora funciona.

Y para añadir un poco de información, Jackson funciona muy bien con todo tipo de datos, incluyendo mapas básicos y listas:

ObjectMapper mapper = new ObjectMapper(); 
String json = mapper.writeValue(list); 
List listOfMaps = mapper.readValue(json, List.class); 

que manejar este caso en particular. Si bien se puede utilizar la información de tipo genérico, es opcional cuando se utiliza el enlace "natural" a los tipos de contenedor JDK.

0

Al usar google gson.

var getRowData = 
[{ 
    "dayOfWeek": "Sun", 
    "date": "11-Mar-2012", 
    "los": "1", 
    "specialEvent": "", 
    "lrv": "0" 
}, 
{ 
    "dayOfWeek": "Mon", 
    "date": "", 
    "los": "2", 
    "specialEvent": "", 
    "lrv": "0.16" 
}]; 

    JsonElement root = new JsonParser().parse(request.getParameter("getRowData")); 
    JsonArray jsonArray = root.getAsJsonArray(); 
    JsonObject jsonObject1 = jsonArray.get(0).getAsJsonObject(); 
    String dayOfWeek = jsonObject1.get("dayOfWeek").toString(); 

// cuando se utiliza Jackson

JsonFactory f = new JsonFactory(); 
       ObjectMapper mapper = new ObjectMapper(); 
      JsonParser jp = f.createJsonParser(getRowData); 
      // advance stream to START_ARRAY first: 
      jp.nextToken(); 
      // and then each time, advance to opening START_OBJECT 
     while (jp.nextToken() == JsonToken.START_OBJECT) { 
      Map<String,Object> userData = mapper.readValue(jp, Map.class); 
      userData.get("dayOfWeek"); 
      // process 
      // after binding, stream points to closing END_OBJECT 
     } 
+0

Si crees que la misma respuesta exacta se aplica a más de una pregunta, tal vez estén duplicadas y deberían marcarse como tales, ¿no crees? –

Cuestiones relacionadas