Lecture JSon Chaîne avec Gson
Question
Je suis pinçant autour de Google en essayant de comprendre cela, mais je ne peux pas sembler le faire. J'ai la chaîne JSON suivante qui est retourné à mon applet java à partir d'une autre source que j'ai besoin d'interagir avec.
{
"A01": {"Status": "Ready", "Time": "00:00"},
"A02": {"Status": "Ready", "Time": "00:00"},
......
}
En ce moment, je ne sais pas comment je devrais utiliser Gson pour analyser que dans mon applet. Quand je parlais aux concepteurs de ce programme. La chaîne JSON a été conçu pour être utilisé en php pas java alors quand je l'ai décodés php il m'a donné un bon éventail de assoc multidimensionnel.
Toutes les suggestions sur ce sujet.
La solution
Un tableau associatif en PHP se traduit par une Map
en Java. Ainsi, dans les yeux de Gson, votre JSON est au format de Map<String, Event>
où la classe a Event
les champs status
et time
.
public class Event {
private String Status;
private String Time;
// Add/generate getters, setters and other boilerplate.
}
Oui, les noms de champs en majuscules sont laids, mais qui est comment votre look JSON comme. Vous auriez besoin autrement de créer un Gson custom désérialiseur .
Voici comment vous pouvez le convertir.
Map<String, Event> events = new Gson().fromJson(json, new TypeToken<Map<String, Event>>(){}.getType());
A01
, A02
, etc deviennent des touches Map
et sa valeur devient la valeur Event
de Map
. Vous pouvez ajouter un autre désérialiseur personnalisé pour obtenir le Time
dans un java.util.Date
.
une autre alternative, vous pouvez également utiliser Map<String, Map<String, String>>
à la place.
Autres conseils
Ce lien m'a fait quelque chose que je ne cherchais pas même à. J'ai oublié de mentionner aussi dans mon post que la connaissance de l'A01, A02, etc est très important. Mais un lien dans le message que vous me fait me conduire à trouver ce qui fonctionne pour moi.
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();
}
Si votre JSON était légèrement différente, comme ci-dessous:
{
[
{"Status": "Ready", "Time": "00:00"},
{"Status": "Ready", "Time": "00:00"},
......
]
}
Gson serait en mesure de convertir le JSON dans une collection d'objets, l'objet que vous auriez à vous définir. Donc, vous devez:
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
}
Et puis utilisez que comme ceci:
Type listType = new TypeToken<List<myAClass>>() {}.getType();
List<myAClass> myAClassList = new Gson().fromJson(json, listType);
//where json is yr json string
Vous pouvez ensuite utiliser la liste des objets que vous avez besoin.