2016-04-13 8 views
-3

JSON文字列:Gsonで異なるオブジェクトのJson配列を解析するには?

[ 
     //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 
     } 

    ] 

私は上記のようなJSON配列を持っています。私が望むのは、それをGsonと異なるオブジェクト型に解析することです(私はそれをより明確にするためにコメントしました)が、私はそれを行う方法を知らない。私を助けてください。前もって感謝します!

+0

リンクAPIを投稿できますか?私はサンプルプロジェクトを作成します –

+0

Gsonはあなたのためにこれを自動的に行いません。 TypeNameを調べるコードを書く必要があり、データがどのJavaオブジェクトに移入するかを決定します。 –

+0

私はそれを知っていますが、私はどのように知っていません。私にいくつかの例を教えてもらえますか? – Kakashi

答えて

9

そんなに多くのsimmilar質問があると思います。 One、これを解析するTwo

一つの方法は、単純な

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

を使用することです。しかし、これはあなたにLinkedTreeMap<Integer, LinkedTreeMap<String, String>>またはこのような何かのオブジェクトを提供します。あなたはそれを使うことができますが、それはちょっと難しく、整数の倍数としての問題もあります。

他のアプローチは、あなたがそれを必要とする場合TypeNameフィールドでカスタムインターフェイスや抽象クラスを作成することです:

private interface CheckInterface{} 

、あなたが持っているオブジェクトタイプのすべてのPOJOクラスでそれを実装:

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; 
} 

次に、CheckInterfaceのカスタムデシリアライザを作成します。

public static class CheckInterfaceDeserializer implements JsonDeserializer<CheckInterface>{ 

    @Override 
    public CheckInterface deserialize(JsonElement json, Type typeOfT, 
         JsonDeserializationContext context) throws JsonParseException { 
     JsonObject jObject = (JsonObject) json; 
     JsonElement typeObj = jObject.get("TypeName"); 

     if(typeObj!= null){ 
      String typeVal = typeObj.getAsString(); 

      switch (typeVal){ 
       case "CheckSpecificDday": 
        return context.deserialize(json, CheckSpecificDday.class); 
       case "CheckEveryDayDday": 
        return context.deserialize(json, CheckEveryDayDday.class); 
       case "CheckEveryDdayOfWeek": 
        return context.deserialize(json, CheckEveryDdayOfWeek.class); 
       case "CheckEveryMonthSpecificDday": 
        return context.deserialize(json, CheckEveryMonthSpecificDday.class); 
       case "CheckEveryYearWeek": 
        return context.deserialize(json, CheckEveryYearWeek.class); 
      } 
     } 

     return null; 
    } 
} 

これはあなたがこれを使う方法です:

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);