Sie zum NullPointerException
queryStudent
Ihrer MapObject
in Ihrem MapModel
Zugriff, da sie nicht richtig gefüllt ist, wenn Sie versuchen, Ihre Json deserialisieren.
So Ihr Problem Blick auf Gson documentation lösen, wo man sehen kann:
Sie die Sammlung mit Gson Serialisierung kann ohne etwas tun spezifisch: toJson (Sammlung) würde die gewünschte Ausgabe schreiben.
Deserialisierung mit fromJson (json, Collection.class) wird nicht funktionieren, da Gson keine Möglichkeit hat, die Eingabe zu den Typen zuzuordnen. Gson erfordert, dass Sie eine genericized Version Auflistungsart in Json() bereitstellen. Also, haben Sie drei Möglichkeiten:
Verwenden Gson Parser API (Low-Level-Streaming-Parser oder der DOM-Parser JsonParser), um die Array-Elemente zu analysieren und dann verwenden Gson.fromJson() auf jedem der Array Elemente.Dies ist der bevorzugte Ansatz. Hier ist ein Beispiel, das zeigt, wie dies zu tun ist.
Registrieren Sie einen Typadapter für Collection.class, der die einzelnen Arrayelemente betrachtet und sie den entsprechenden Objekten zuordnet. Der Nachteil dieses Ansatzes ist, dass es Deserialisierung anderer Sammlungstypen in Gson vermasseln wird.
Registrieren Sie einen Typadapter für MyCollectionMemberType und verwenden Sie fromJson() mit Collection.
Da Ihr MapObject
containts ein java.util.Map
aber Ihre Klasse selbst es nicht generisch, ich denke, dass ein guter Ansatz für Ihren Fall ist eine Deserializer
erstellen.
Bevor Sie versuchen, Ihre Klassendefinition zu bereinigen, bieten Sie Konstruktoren an, um den Deserializer einfach zu erstellen.Ihre POJO Klassen könnten sein:
Student-Klasse
public class Student{
public String date;
public String seqId;
public String status;
public Student(String date, String seqId, String status){
this.date = date;
this.seqId = seqId;
this.status = status;
}
}
MapObject Klasse
Anmerkung: Ich ändern Sie Map
Definition, da in Ihrem Json scheint, dass mehrere sein könnte Studenten für jeden DynamicName
(Blick auf DynamicName2
von Ihrer Frage), so verwende ich Map<String,List<Student>>
statt Map<String,Student>
:
public class MapObject{
public Map<String,List<Student>> queryStudent;
public MapObject(Map<String,List<Student>> value){
this.queryStudent = value;
}
}
MapModel Klasse
public class MapModel {
public MapObject map;
}
Jetzt eine Deserializer
für Ihre MapObject
erstellen:
public class MapObjectDeserializer implements JsonDeserializer<MapObject> {
public MapObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
Map<String,List<Student>> queryStudents = new HashMap<String,List<Student>>();
// for each DynamicElement...
for (Map.Entry<String,JsonElement> entry : json.getAsJsonObject().entrySet()) {
List<Student> students = new ArrayList<Student>();
// each dynamicElement has an Array so convert and add an student
// for each array entry
for(JsonElement elem : entry.getValue().getAsJsonArray()){
students.add(new Gson().fromJson(elem,Student.class));
}
// put the dinamic name and student on the map
queryStudents.put(entry.getKey(),students);
}
// finally create the mapObject
return new MapObject(queryStudents);
}
}
schließlich die Deserializer
registrieren und analysieren Ihre Json:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MapObject.class, new MapObjectDeserializer());
Gson gson = builder.create();
MapModel object = gson.fromJson(YourJson,MapModel.class);
HAFTUNGSAUSSCHLUSS: Für schnelles Prototyping Ich teste diese groovy verwenden, versuche ich die Java Syntax zu halten, aber ich kann etwas vergessen, trotzdem denke ich, dass diese Sie auf die richtige Richtung setzen.
Hoffe es hilft,
hast du es gelöst? – Bharatesh
Überprüfen Sie diese Antwort, es zeigt, wie Sie die Schlüssel in einem Objekt erhalten, ich denke, Sie müssen es manuell tun, um alle Schlüssel in "map" zu bekommen und über http://stackoverflow.com/questions/31094305/java- iterieren gson-bekommen-die-Liste-aller-Schlüssel-unter-einem-jsonobject – Yazan