2014-10-30 99 views
2
化JSON類屬性名

我有以下JSON:如何識別使用GSON

{ 
    "list": [ 
     { 
      "BaseClass": { 
       "id": 0 
      } 
     }, 
     { 
      "ExtendedClass1": { 
       "id": 1, 
       "sum": 100 
      } 
     }, 
     { 
      "ExtendedClass1_1": { 
       "id": 2, 
       "sum": 200, 
       "expr": "text" 
      } 
     }, 
     { 
      "ExtendedClass2": { 
       "id": 3, 
       "total": 300 
      } 
     } 
    ] 
} 

而且我有以下班,宣稱繼承:

MetaClass.java

import java.util.ArrayList; 

import com.google.gson.Gson; 

public class MetaClass{ 

    public ArrayList<BaseClass> list = new ArrayList<BaseClass>(); 

    public static void main(String[] args) { 

     String json = "{\"list\":[{\"BaseClass\":{\"id\":0}},{\"ExtendedClass1\":{\"id\":1,\"sum\":100}},{\"ExtendedClass1_1\":{\"id\":2,\"sum\":200,\"expr\":\"text\"}},{\"ExtendedClass2\":{\"id\":3,\"total\":300}}]}"; 

     MetaClass gson = new Gson().fromJson(json, MetaClass.class); 

     } 

} 

BaseClass.java

public class BaseClass{ 
    public int id; 
    public BaseClass() { 
    } 
} 

ExtendedClass1.java

public class ExtendedClass1 extends BaseClass{ 
    public ExtendedClass1() { 
    } 
    public int sum; 
} 

ExtendedClass2.java

public class ExtendedClass2 extends BaseClass { 
    public ExtendedClass2() { 
    } 
    public int total; 
} 

ExtendedClass1_1.java

public class ExtendedClass1_1 extends ExtendedClass1 { 
    public ExtendedClass1_1() {  
    } 
    public String expr; 
} 

另外,可能有很多這樣的類具有多級繼承。我試圖讓這個例子更簡單。如何正確解析提到的json字符串?假設討好,我不能改變輸入JSON,只有我可以改變類和編寫自定義fromJson命令莫名其妙......

編輯:當然,我可以添加到BaseClass.java,可以在JSON滿足所有屬性(見下文),但它似乎不是優雅的解決方案。

public ExtendedClass1 ExtendedClass1; 
public ExtendedClass2 ExtendedClass2; 
public ExtendedClass1_1 ExtendedClass1_1; 
+0

關閉我的頭頂,看看TypeAdaptors – user489041 2014-10-30 15:02:49

+0

user489041,你能更精確地寫答案嗎? – Anton 2014-10-30 15:19:01

+0

下面是使用TypeAdapter的SO上的類似答案:http://stackoverflow.com/a/6018852/2543138 – brwngrldev 2014-10-30 16:22:58

回答

0

您可以編寫自定義TypeAdapter並將其註冊到gsonBuilder。在您的自定義類型適配器的方法read中,您必須管理映射以創建您定義的類的正確實例。我用你的列表JSON數組的項目的標籤:

public class CustomTypeAdapter extends TypeAdapter<BaseClass> { 

    @Override 
    public BaseClass read(JsonReader in) throws IOException { 
     BaseClass item = null; 

     Gson gson = new Gson(); 

     JsonParser jsonParser = new JsonParser(); 
     JsonObject jo = (JsonObject)jsonParser.parse(in); 

     JsonElement je = null; 
     if ((je = jo.get("BaseClass")) != null) { 
      item = gson.fromJson(je, BaseClass.class); 
     } else if((je = jo.get("ExtendedClass1")) != null) { 
      item = gson.fromJson(je, ExtendedClass1.class); 
     } else if((je = jo.get("ExtendedClass1_1")) != null) { 
      item = gson.fromJson(je, ExtendedClass1_1.class); 
     } else if((je = jo.get("ExtendedClass2")) != null) { 
      item = gson.fromJson(je, ExtendedClass2.class); 
     } 

     return item; 
    } 

    @Override 
    public void write(JsonWriter out, BaseClass item) throws IOException { 
     throw new IllegalArgumentException("TypeAdapter.write method not implemented!"); 
    } 
} 

測試:

String json = "{\"list\":[{\"BaseClass\":{\"id\":0}},{\"ExtendedClass1\":{\"id\":1,\"sum\":100}},{\"ExtendedClass1_1\":{\"id\":2,\"sum\":200,\"expr\":\"text\"}},{\"ExtendedClass2\":{\"id\":3,\"total\":300}}]}"; 

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(BaseClass.class, new CustomTypeAdapter()); 
Gson gson = gsonBuilder.create(); 

java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken<List<BaseClass>>() {}.getType(); 

JsonArray jsonList = (JsonArray) (gson.fromJson(json, JsonObject.class).get("list")); 
List<BaseClass> itemList = gson.fromJson(jsonList, listType);