我正在尝试解析此链接中的JSON:https://api.guildwars2.com/v2/items/56,一切正常,直到我遇到这一行:"infix_upgrade":{"attributes":[{"attribute":"Power","modifier":4},{"attribute":"Precision","modifier":3}]}
...
如果我没有弄错:infix_upgrade
内有1个元素attributes
。 attributes
有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
我认为它来自属性......
答案 0 :(得分: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 / etc更好。
这将为您提供一个良好的起点:
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);
希望它有所帮助! :)