Как десериализовать карту<String, Object> с помощью GSON
Я довольно новичок в GSON и получаю JSON-ответ этого формата (более простой пример, поэтому значения не имеют смысла):
{
"Thomas": {
"age": 32,
"surname": "Scott"
},
"Andy": {
"age": 25,
"surname": "Miller"
}
}
Я хочу, чтобы GSON сделал это 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
Любая помощь приветствуется:)
2 ответа
Решение
Следующее работает для меня
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.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"}}