如何使用GSON反序列化Map<String, Object>?

16

我对GSON相当陌生,得到一个这样的JSON响应格式(只是一个更容易的例子,所以值没有意义):

{
    "Thomas": {
        "age": 32,
        "surname": "Scott"
    },
    "Andy": {
        "age": 25,
        "surname": "Miller"
    }
}

我希望使用GSON将PersonData转换为Map,PersonData显然是一个对象。名称字符串是PersonData的标识符。

正如我所说,我对GSON非常陌生,只尝试了类似以下的代码:

Gson gson = new Gson();
Map<String, PersonData> decoded = gson.fromJson(jsonString, new TypeToken<Map<String, PersonData>>(){}.getType());

但是这样会抛出错误:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 3141

非常感谢您的帮助 :)


1
你的Json无效。在“Andy”之前需要一个逗号。 - Taylor
1
很抱歉,JSON肯定是有效的。我只是缩短了JSON并忘记了它。更多关于GSON部分的内容是如何将其解释为键值对,其中值是一个要由GSON序列化的对象。 - luuksen
2个回答

28
以下示例对我来说很有效。
static class PersonData {
    int age;
    String surname;
    public String toString() {
        return "[age = " + age + ", surname = " + surname + "]";
    }
}

public static void main(String[] args) {
    String json = "{\"Thomas\": {\"age\": 32,\"surname\": \"Scott\"},\"Andy\": {\"age\": 25,\"surname\": \"Miller\"}}";
    System.out.println(json);
    Gson gson = new Gson();
    Map<String, PersonData> decoded = gson.fromJson(json, new TypeToken<Map<String, PersonData>>(){}.getType());
    System.out.println(decoded);
}

打印
{"Thomas": {"age": 32,"surname": "Scott"},"Andy": {"age": 25,"surname": "Miller"}}
{Thomas=[age = 32, surname = Scott], Andy=[age = 25, surname = Miller]}

很可能你的PersonData类是非常不同的。

好的,我又遇到了一个问题,很抱歉浪费了您的时间。我的类类型有错误,我没有在这里发布,但是您确认 GSON 部分有效的回复帮助我意识到该看哪里。谢谢! - luuksen
@luuksen 不用谢。Gson 通常在其错误报告中表现得非常出色。BEGIN_ARRAYBEGIN_OBJECTNUMBERSTRING 将显示 Gson 解析器实际读取的内容,而不是期望的内容。 - Sotirios Delimanolis

2
你可以使用 gson.toJsonTree(Object o) 将你的自定义对象转换为 JSON 格式。
以下方法适用于我:
private static class PersonData {
    private int age;
    private String surname;

    public PersonData(int age, String surname) {
        this.age = age;
        this.surname = surname;
    }
}

public static void main(String[] args) {
    PersonData first = new PersonData(24, "Yovkov");
    PersonData second = new PersonData(25, "Vitanov");

    Gson gson = new Gson();

    JsonObject jsonObject = new JsonObject();
    jsonObject.add("kocko", gson.toJsonTree(first));
    jsonObject.add("deyan", gson.toJsonTree(second));

    System.out.println(gson.toJson(jsonObject));

}

并且打印:

{"kocko":{"age":24,"surname":"Yovkov"},"deyan":{"age":25,"surname":"Vitanov"}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接