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

问题描述 投票:0回答:2
我对 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

任何帮助表示赞赏:)

java serialization gson
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

课程可能非常不同。


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"}}
    
© www.soinside.com 2019 - 2024. All rights reserved.