2010-11-23 18 views
6

He estado buscando en Google tratando de resolver esto, pero parece que no puedo hacerlo. Tengo la siguiente cadena json que se devuelve a mi applet Java desde otra fuente con la que necesito interactuar.Lectura de JSon String con Gson

{ 
"A01": {"Status": "Ready", "Time": "00:00"}, 
"A02": {"Status": "Ready", "Time": "00:00"}, 
...... 
} 

Por el momento no estoy seguro de cómo debería usar Gson para analizar eso en mi applet. Cuando hablé con los diseñadores de ese programa. La cadena json fue diseñada para php not java así que cuando la decodifiqué en php me dio una buena matriz associal multidimensional.

Cualquier sugerencia sobre esto.

Respuesta

7

Una matriz asociativa en PHP se traduce en un Map en Java. Entonces, a los ojos de Gson, su JSON está en formato de Map<String, Event> donde la clase Event tiene los campos status y time.

public class Event { 
    private String Status; 
    private String Time; 

    // Add/generate getters, setters and other boilerplate. 
} 

Sí, los nombres de los campos en mayúscula son feos, pero así es como se ve el JSON. De lo contrario, necesitaría crear un custom Gson deserializer.

Así es cómo se puede convertir.

Map<String, Event> events = new Gson().fromJson(json, new TypeToken<Map<String, Event>>(){}.getType()); 

A01, A02, etc se convierten en Map llaves y su valor se convierte en el valor de EventMap. Es posible que desee agregar otro deserializador personalizado para obtener el Time en un java.util.Date.

Como alternativa diferente, también puede usar Map<String, Map<String, String>>.

1

Si su JSON era ligeramente diferente, como a continuación:

{ 
[ 
    {"Status": "Ready", "Time": "00:00"}, 
    {"Status": "Ready", "Time": "00:00"}, 
    ...... 
] 
} 

Gson sería capaz de convertir el JSON en una colección de objetos, el objeto que tendría que definir usted mismo. Por lo que se necesita:

public class myAClass { 
public String Status; 
public Double time; //this could be a string/or even a Date I guess, 
        //not sure what data you are expecting 
        //and the colon may cause a problem if parsed as a double 
} 

Y luego usar ese modo:

Type listType = new TypeToken<List<myAClass>>() {}.getType(); 
List<myAClass> myAClassList = new Gson().fromJson(json, listType); 
//where json is yr json string 

A continuación, puede utilizar la lista de objetos como sea necesario.

(lectura adicional sobre here)

2

Ese enlace me señaló algo que ni siquiera estaba mirando. También olvidé mencionar en mi publicación que Conocer el A01, A02, etc. es muy importante. Pero un enlace en la publicación que me indicaste me llevó a pensar en esto que funciona para mí.

JsonParser parse = new JsonParser(); 
JsonObject jobj = (JsonObject)parse.parse(status);        
Set<Map.Entry<String, JsonElement>> map = jobj.entrySet(); 
Iterator<Map.Entry<String, JsonElement>> iterator = map.iterator(); 
int size = map.size(); 
for(int k = 0; k < size; k++) 
{ 
    Map.Entry<String, JsonElement> entry = iterator.next(); 
    String key = entry .getKey(); 
    JsonObject jele = (JsonObject)entry.getValue(); 
} 
+0

La mayoría de las bibliotecas JSON tienen una o dos operaciones de línea para hacer lo mismo; no debería haber ninguna necesidad de escribir este código manualmente. Con Gson creo que necesitaría pasar TypeToken > para obtener el resultado deseado. – StaxMan

+0

Aunque entiendo eso, normalmente tengo personas que trabajan con mi, mientras que ellos pueden programar un poco, no hay trabajo. Y romper las cosas así, mientras que es más código. Es más fácil para ellos cuando lo miran. – Pyromanci