GSON从复杂的json中获取字符串

时间:2015-04-07 16:14:01

标签: java json jsp java-ee gson

我正在尝试解析此链接中的JSON:https://api.guildwars2.com/v2/items/56,一切正常,直到我遇到这一行:"infix_upgrade":{"attributes":[{"attribute":"Power","modifier":4},{"attribute":"Precision","modifier":3}]} ...

如果我没有弄错:infix_upgrade内有1个元素attributesattributes有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 个答案:

答案 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);

希望它有所帮助! :)