2015-04-07 78 views
0

我想從這個鏈接解析JSON字符串獲得:https://api.guildwars2.com/v2/items/56,一切很好,直到我遇到了行:"infix_upgrade":{"attributes":[{"attribute":"Power","modifier":4},{"attribute":"Precision","modifier":3}]} ...GSON從複雜的JSON

如果我沒有得到這個錯誤:infix_upgrade有1元attributes在他裏面。 attributes有2個元素和其他2個元素。這是一個2維數組嗎?

我已經試過(代碼太長髮布):

JsonObject _detailsObject = _rootObject.get("details").getAsJsonObject(); 
JsonObject infix_upgradeObject = _detailsObject.get("infix_upgrade").getAsJsonObject(); 
JsonElement _infix_upgrade_attributesElement = infix_upgradeObject.get("attributes"); 
JsonArray _infix_upgrade_attributesJsonArray = _infix_upgrade_attributesElement.getAsJsonArray(); 

的問題是,我不知道下一步該怎麼做,還試圖繼續轉化JsonArray到字符串數組是這樣的:

Type _listType = new TypeToken<List<String>>() {}.getType(); 
List<String> _details_infusion_slotsStringArray = new Gson().fromJson(_infix_upgrade_attributesJsonArray, _listType); 

但即時得到java.lang.IllegalStateException: Expected STRING but was BEGIN_OBJECT我的猜測來自屬性...

回答

1

以適當的格式(JSONLint,例如,檢查是否JSON數據是有效的和做的格式,這使得結構比GW鏈路提供了什麼更清晰),attributes實際上看起來是這樣的:

"attributes": [ 
       { 
        "attribute": "Power", 
        "modifier": 4 
       }, 
       { 
        "attribute": "Precision", 
        "modifier": 3 
       } 
      ] 

所以它的JSONObject的數組,每個對象爲兩個鍵值對。這就是解析器拋出一個錯誤的原因,因爲你需要這個數組只包含String,而不是這種情況。

所以實際類型:

Type _listType = new TypeToken<List<JsonObject>>(){}.getType(); 

的問題是,我不知道下一步

等一下什麼。你使用的是Gson,Java是OO語言,所以我建議你創建類。

因爲您只需提供JSON數據表示給解析器的實際類的類,所以稍後您可以更輕鬆地獲取數據並進行解析(某些邊緣案例可以通過編寫自定義串行器/解串器)。

數據也比這一堆JsonObject/JsonArray /等類型更好。

這會給你一個很好的起點:

class Equipment { 
    private String name; 
    private String description; 
    ... 
    @SerializedName("game_types") 
    private List<String> gameTypes; 
    ... 
    private Details details; 
    ... 
} 
class Details { 
    ... 
    @SerializedName("infix_upgrade") 
    private InfixUpgrade infixUpgrade; 
    ... 
} 
class InfixUpgrade { 
    private List<Attribute> attributes; 
    ... 
} 
class Attribute { 
    private String attribute; 
    private int modifier; 
    ... 
} 

,然後只給類型解析器:

Equipment equipment = new Gson().fromJson(jsonString, Equipment.class); 

希望它能幫助! :)