2016-12-01 61 views
1
反序列化嵌套對象

我試圖反序列化下面的結構與GSON

{ meta: { keywords: [a, b, c, d]} ... } 

其他有效的結構

{ meta: { keywords: "a,b,c,d"} ... } 

{ meta: {keywords: "a"} ...} 

我有這個類

public class Data { 
    @PropertyName("meta") 
    MetaData meta; 
    ... 
} 


public class MetaData { 
    List<String> keywords; 
    ... 
} 

和一個自定義解串器

public static class CustomDeserilizer implements JsonDeserializer<MetaData>{ 
    @Override 
    public MetaData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     List<String> keywords = null; 
     Gson gson = new Gson(); 
     MetaData metaData = gson.fromJson(json, AppMetaData.class); 
     JsonObject jsonObject = json.getAsJsonObject(); 

     if (jsonObject.has("keywords")) { 
      JsonElement elem = jsonObject.get("keywords"); 
      if (elem != null && !elem.isJsonNull()) { 

       if (jsonObject.get("keywords").isJsonArray()) { 
        keywords = gson.fromJson(jsonObject.get("keywords"), new TypeToken<List<String>>() { 
        }.getType()); 
       } else { 
        String keywordString = gson.fromJson(jsonObject.get("keywords"), String.class); 
        keywords = new ArrayList<String>(); 
        list.addAll(Arrays.asList(keywordString.split(","))); 
       } 
      } 
     } 
     metaData.setKeywords(keywords); 
} 

然後我嘗試應用deserilizer:

Gson gson = new GsonBuilder()    
     .registerTypeAdapter(Data.class,new CustomDeserilizer())    
     .create(); 

但我得到一個解析錯誤,因爲試圖反序列化數據,而不是元數據,我該怎麼申請這個反序列化器使它工作正確嗎?

回答

2

我解決它創造了我的類數據解串器。

public static class DataDeserilizer implements JsonDeserializer { 
    @Override 
    public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 

     Gson gson = new Gson(); 
     Data data = gson.fromJson(json, Data.class); 
     JsonObject jsonObject = json.getAsJsonObject(); 
     if (jsonObject.has("meta")) { 
      JsonElement elem = jsonObject.get("meta"); 
      if (elem != null && !elem.isJsonNull()) { 

       Gson gsonDeserializer = new GsonBuilder() 
         .registerTypeAdapter(MetaData.class, new CustomDeserilizer()) 
         .create(); 
       gsonDeserializer.fromJson(jsonObject.get("meta"), Data.class); 
      } 
     } 

     return data; 
    } 



} 

而且

Gson gson = new GsonBuilder()    
    .registerTypeAdapter(Data.class,new DataDeserilizer())    
    .create(); 

很明顯的,但有一個更好的解決方案?

0

首先,將您的類重命名爲元而不是元數據,並將關鍵字String而不是List.Then使用以下內容將JSonString映射到您的對象中。

Gson gson = new GsonBuilder().create(); 
Meta meta = gson.from(yourJsonString,Meta.class); 

爲了獲得關鍵字只,你需要這個。

JsonObject jsonObject = new JsonObject(yourJSonString); 
String data = jsonObject.getJsonObject("meta").getString("keywords"); 

關鍵字是一個JSONObject不是JsonArray所以你不能直接映射它 到列表中。您可以拆分字符串以獲取數組中的關鍵字。

String keywords[] = data.split(","); 
+0

您好Umer,爲我的類創建反序列化器數據解決了問題(爲嵌套對象分配一個自定義的反序列化器),但我正在尋找解決方案,如傑克遜的@JsonDeserialize annotion。 – Osarez