【问题标题】:How to de-serialize a Map<String, Object> with GSON如何使用 GSON 反序列化 Map<String, Object>
【发布时间】:2013-12-29 16:40:42
【问题描述】:

我对 GSON 相当陌生,并获得了这种格式的 JSON 响应(只是一个更简单的示例,因此这些值没有意义):

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

我想让 GSON 把它变成一个 Map,PersonData 显然是一个 Object。名称字符串是 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

任何帮助表示赞赏:)

【问题讨论】:

  • 您的 Json 无效。 “Andy”之前需要一个逗号
  • 对不起,JSON 绝对有效。我只是缩短了 JSON 并忘记了它。更多关于 GSON 部分如何将其解释为键值,其中 value 是要由 GSON 序列化的对象。

标签: java serialization gson


【解决方案1】:

以下对我有用

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 不客气。 Gson 的错误陈述通常非常好。 BEGIN_ARRAY、BEGIN_OBJECT、NUMBER 和 STRING 将指示 Gson 解析器实际读取的内容而不是预期的内容。
【解决方案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"}}

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2014-10-16
    • 1970-01-01
    • 2012-09-16
    • 2021-09-07
    相关资源
    最近更新 更多