2016-05-17 9 views
1
{ 
"localeCode": "", 
"map": { 
    "DynamicName1": [], 
    "DynamicName2": [ 
     { 
      "date": "2016-05-15T00:00:00", 
      "seqId": 1, 
      "status": 10 
     }, 
     { 
      "date": "2016-05-16T00:00:00", 
      "seqId": 83, 
      "status": 10 
     } 
    ], 
    "DynamicName3": [], 
    "DynamicName4": [] 
}, 
"respCode": 100, 
"respMsg": "success", 
"status": 1 
} 

Wie man diese Art von json korrekt abbildet. Wenn Sie das sehen können, ist ein dynamischer Name. Bisher habe ich das getan:Wie verwende ich dynamischen Json-Wert für meine POJO-Klasse mit Gson?

public class MapModel { 

public MapObject map; 

public static class MapObject{ 
    public java.util.Map<String, Student> queryStudent; 

    public static class Student{ 
     public String date; 
     public String seqId; 
     public String status; 
    } 
} 
} 

Aber wenn Sie die App ausführen. Ich bekomme NullPointerException. Kann mir jemand helfen?

+0

hast du es gelöst? – Bharatesh

+0

Ü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

Antwort

1

Sie zum NullPointerExceptionqueryStudent 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:

  1. 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.

  2. 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.

  3. 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,