GSON 从复数 json 中获取字符串
GSON get string from complex json
我正在尝试从这个 link: https://api.guildwars2.com/v2/items/56 解析 JSON ,一切都很好,直到我遇到了这条线:"infix_upgrade":{"attributes":[{"attribute":"Power","modifier":4},{"attribute":"Precision","modifier":3}]}
...
如果我没记错的话:infix_upgrade
体内有 1 个元素 attributes
。 attributes
有 2 个元素,其中还有 2 个元素。这是一个二维数组吗?
我试过了(代码太长post):
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
,我猜这是来自属性...
经过适当的格式化(JSONLint,例如检查JSON数据是否有效并进行格式化,这使得结构比GW更清晰link给出),attributes
看起来实际上是这样的:
"attributes": [
{
"attribute": "Power",
"modifier": 4
},
{
"attribute": "Precision",
"modifier": 3
}
]
所以它是一个 JsonObject 数组,每个对象都是两个键值对。这就是解析器抛出错误的原因,因为您要求此数组仅包含字符串,但事实并非如此。
所以实际类型是:
Type _listType = new TypeToken<List<JsonObject>>(){}.getType();
The problem is that I dont know what to do next
稍等。您正在使用 Gson 并且 Java 是一种面向对象的语言,因此我建议您创建 classes.
这会让您以后更容易获取数据并进行解析,因为您只需要提供实际 class 的 class,JSON 数据表示给解析器(一些边缘情况可以通过编写自定义 serializer/deserializer 来处理)。
数据也比这一堆好打字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);
希望对您有所帮助! :)
我正在尝试从这个 link: https://api.guildwars2.com/v2/items/56 解析 JSON ,一切都很好,直到我遇到了这条线:"infix_upgrade":{"attributes":[{"attribute":"Power","modifier":4},{"attribute":"Precision","modifier":3}]}
...
如果我没记错的话:infix_upgrade
体内有 1 个元素 attributes
。 attributes
有 2 个元素,其中还有 2 个元素。这是一个二维数组吗?
我试过了(代码太长post):
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
,我猜这是来自属性...
经过适当的格式化(JSONLint,例如检查JSON数据是否有效并进行格式化,这使得结构比GW更清晰link给出),attributes
看起来实际上是这样的:
"attributes": [
{
"attribute": "Power",
"modifier": 4
},
{
"attribute": "Precision",
"modifier": 3
}
]
所以它是一个 JsonObject 数组,每个对象都是两个键值对。这就是解析器抛出错误的原因,因为您要求此数组仅包含字符串,但事实并非如此。
所以实际类型是:
Type _listType = new TypeToken<List<JsonObject>>(){}.getType();
The problem is that I dont know what to do next
稍等。您正在使用 Gson 并且 Java 是一种面向对象的语言,因此我建议您创建 classes.
这会让您以后更容易获取数据并进行解析,因为您只需要提供实际 class 的 class,JSON 数据表示给解析器(一些边缘情况可以通过编写自定义 serializer/deserializer 来处理)。
数据也比这一堆好打字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);
希望对您有所帮助! :)