2016-04-13 15 views
-3

Json string:Wie JSON Array von verschiedenen Objekten mit Gson analysieren?

[ 
     //Object 1 

     { 
      TypeName:"CheckSpecificDday", 
      SpecificDay:"20160413", 
      Lunar:1 
     }, 

     { 
      TypeName:"CheckSpecificDday", 
      SpecificDay:"20160414", 
      Lunar:1 
     }, 

     //Object 2 

     { 
      TypeName:"CheckEveryDayDday", 
      StartDate:"20160413", 
      EndDate:"20260417", 
      Interval:1, 
      StartOption:"D", 
      HolidayCondition:1 
     }, 

     //Object 3 

     { 
      TypeName:"CheckEveryDdayOfWeek", 
      StartDate:"20160413", 
      EndDate:"", 
      Interval:1, 
      SpecificDayOfWeek:"3", 
      HolidayCondition:1 
     }, 

     //Object 4 

     { 
      TypeName:"CheckEveryMonthSpecificDday", 
      StartDate:"20160413", 
      EndDate:"", 
      Interval:1, 
      SpecificDD:"13,14", 
      HolidayCondition:1 
     }, 

     //Object 5 

     { 
      TypeName:"CheckEveryYearWeek", 
      StartDate:"20160413", 
      EndDate:"", 
      Interval:1, 
      SpecificMMnthWeek:"0433", 
      HolidayCondition:1 
     } 

    ] 

Ich habe eine Json Array wie oben. Ich möchte es mit Gson auf verschiedene Objekttypen analysieren (wie ich es kommentierte, um es klarer zu machen), aber ich weiß nicht, wie ich das machen soll. Bitte hilf mir. Vielen Dank im Voraus!

+0

Können Sie Link API veröffentlichen. Ich werde ein Beispielprojekt erstellen –

+0

Gson wird dies nicht automatisch für Sie tun. Sie müssen Code schreiben, der TypeName betrachtet und eine Entscheidung darüber trifft, welches Java-Objekt seine Daten auffüllen sollen. –

+0

Ich weiß das, aber ich weiß nicht wie. Kannst du mir ein Beispiel geben? – Kakashi

Antwort

9

Ich denke, es gibt viele ähnliche Fragen zu SO. One, Two

Eine Möglichkeit, dies zu analysieren, ist einfach

Object[] result = new Gson().fromJson(json, Object[].class); 

zu verwenden, aber dies wird Ihnen wie diese Objekte von LinkedTreeMap<Integer, LinkedTreeMap<String, String>> oder etwas geben. Sie können es verwenden, aber es ist ein bisschen schwer und Sie werden auch Probleme mit Ihren ganzen Zahlen haben, die als Doppel kommen.

Der andere Ansatz ist kundenspezifische Schnittstelle oder eine abstrakte Klasse mit TypeName Feld zu erstellen, wenn Sie es brauchen:

private interface CheckInterface{} 

und es mit allen POJO Klassen von Objekttypen implementieren Sie haben:

private static class CheckEveryDayBase implements CheckInterface{ 
    private String StartDate; 
    private String EndDate; 
    private int Interval; 
    private int HolidayCondition; 
} 

private static class CheckSpecificDday implements CheckInterface{ 
    private String SpecificDay; 
    private int Lunar; 
} 

private static class CheckEveryDayDday extends CheckEveryDayBase{ 
    private String StartOption; 
} 

private static class CheckEveryDdayOfWeek extends CheckEveryDayBase{ 
    private String SpecificDayOfWeek; 
} 

private static class CheckEveryMonthSpecificDday extends CheckEveryDayBase{ 
    private String SpecificDD; 
} 

private static class CheckEveryYearWeek extends CheckEveryDayBase{ 
    private String SpecificMMnthWeek; 
} 

Dann erstellen Sie einen benutzerdefinierten Desrializer für Ihre :

So können Sie das verwenden:

GsonBuilder builder = new GsonBuilder(); 

// Register custom deserializer for CheckInterface.class 
builder.registerTypeAdapter(CheckInterface.class, new CheckInterfaceDeserializer()); 
Gson gson = builder.create(); 

CheckInterface[] result2 = gson.fromJson(json, CheckInterface[].class); 
Verwandte Themen