2016-01-20 143 views
1

我有這樣的json結構,我如何在Gson的幫助下解析json。我需要將關鍵值存儲在json對象中,我嘗試了很多與動態數組相關的示例,但沒有使用動態json數組方括號我不能解析使用Gson.Any解決方案或需要做手動Json解析?如果任何人感到重複評論下面的答案。解析gson中的動態Json對象

{ "Result":[[ 
     "Title", 
     { 
     "0": 1323, 
     "1": 3358, 
     "2": 2123, 
     "3": 8536, 
     "4": 1399, 
     "5": 9303, 
     "7": 9732, 
     "8": 3433, 
     "9": 1383 
     } 
    ],[ 
     "Title", 
     { 
     "0": 1323, 
     "1": 3358, 
     "2": 2123, 
     "3": 8536, 
     } 
    ]]} 
+1

怎麼樣[ MCVE] – jkalden

+0

在你的Json數據中,標題是必需的......或者任何類似於「Title:xyz」的標籤 –

+0

@ Don'tBenegative「標題」是一個沒有鍵的對象,不像你提到的那樣。 – appukrb

回答

1

要開始,你的JSON導致異常被拋出,因爲它是無效的 - 你必須在第二個例子中的最後一個值的末尾一個額外的逗號。 "3": 8536,應該是"3": 8536

修復後,這應該是一個簡單的任務,只要你正確定義你的對象。以下是我想出了:

public class Results { 
    @SerializedName("Result") 
    List<Result> results; 
} 

public class Result { 
    String title; 
    Map<String, Integer> results; 
} 

從那裏,Result類需要在一個特殊的方式來反序列化,因爲在Result類中的字段不直接映射到JSON條目。相反,我們需要取消每個Result中包含的JsonArray的第一個和第二個元素,並相應地對其進行解析。看起來像這樣:

public class ResultDeserializer implements JsonDeserializer<Result> { 

    @Override 
    public Result deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     JsonArray array = json.getAsJsonArray(); 

     Result result = new Result(); 
     result.title = array.get(0).getAsString(); 

     result.results = new LinkedHashMap<String, Integer>(); 
     for(Entry<String, JsonElement> entry : array.get(1).getAsJsonObject().entrySet()) { 
      result.results.put(entry.getKey(), entry.getValue().getAsInt()); 
     } 

     return result; 
    } 
} 

請注意,我的示例省略了錯誤檢查。最後,註冊這個解串器,你應該準備就緒:

Gson gson = new GsonBuilder().registerTypeAdapter(Result.class, new ResultDeserializer()).create(); 

Results results = gson.fromJson(json, Results.class); 

for(Result r : results.results) { 
    System.out.println("Title = " + r.title); 
    for(Entry<String, Integer> entry : r.results.entrySet()) { 
     System.out.println("\t " + entry.getKey() + " -> " + entry.getValue()); 
    } 
} 

此打印:

Title = Title 
    0 -> 1323 
    1 -> 3358 
    2 -> 2123 
    3 -> 8536 
    4 -> 1399 
    5 -> 9303 
    7 -> 9732 
    8 -> 3433 
    9 -> 1383 
Title = Title 
    0 -> 1323 
    1 -> 3358 
    2 -> 2123 
    3 -> 8536 

我要把它留給OP實行反向,那就是爲Result到串行產生相同的結果。

0

找到簡單的方式在GSON

Result.java

public class Result { 
    @SerializedName("formatted_facet_fields") 
    Map<String,Map<String,String>> formatted_facet_fields; 
} 

來解析上述使用嵌套地圖 JSON響應接收側

Gson gson=new Gson(); 
Result result = gson.fromJson(json_response, Result.class);