#java #json #gson
#java #json #gson
Вопрос:
{"myContainer" :
{ "couldBeAnything" : [
{"id":1, "name":"sb", "category":"couldBeAnything"},
{"id":2, "name":"bs", "category":"couldBeAnything"}
],
"somethingElse" : [
{"id":1, "name":"sdsa","category":"somethingElse"},
{"id":2, "name":"ve","category":"somethingElse"}
]
},
"id" : 0
}
Пока у меня есть :
Type myContainerType = new TypeToken<MyContainer>(){}.getType();
MyContainerType myContainerType = gson.fromJson(myJson.getValue(), myContainerType);
Где
public class MyContainer {
private int id;
private Map<String, List<Foo>> foo; // and foo has id, name, category
Результат, никаких ошибок, заполненное поле id, но просто нулевая карта
Ответ №1:
Я думаю, что json не подходит для структуры Map<String, List<Foo>>
. Когда вы говорите map, вам не нужно заключать каждый ключ-значение в {
. Просто поместите все ключевые значения в одно {}
и разделите запятыми. например
{
"myContainer": {
"couldBeAnything": [
{
"id": 1,
"name": "sb",
"category": "couldBeAnything"
},
{
"id": 2,
"name": "bs",
"category": "couldBeAnything"
}
],
"somethingElse": [
{
"id": 1,
"name": "sdsa",
"category": "somethingElse"
},
{
"id": 2,
"name": "ve",
"category": "somethingElse"
}
]
},
"id": 0
}
С этим json это работает отлично
public static void main(String[] args){
String json = "{"myContainer":{"couldBeAnything":[{"id":1,"name":"sb","category":"couldBeAnything"},{"id":2,"name":"bs","category":"couldBeAnything"}],"somethingElse":[{"id":1,"name":"sdsa","category":"somethingElse"},{"id":2,"name":"ve","category":"somethingElse"}]},"id":0}";
Map<String, List<Foo>> obj = new HashMap<String, List<Foo>>();
Gson gson = new Gson();
obj = gson.fromJson(json, obj.getClass());
System.out.println(obj);
}
Вывод
{id=0.0, myContainer={couldBeAnything=[{id=1.0, name=sb, category=couldBeAnything}, {id=2.0, name=bs, category=couldBeAnything}], somethingElse=[{id=1.0, name=sdsa, category=somethingElse}, {id=2.0, name=ve, category=somethingElse}]}}
Проблема с вашим подходом заключалась в именовании поля foo . Ваш json содержит Map<String, List<Foo>>
имя как MyContainer. Поэтому измените свой класс контейнера, как показано ниже, и он будет работать нормально 🙂
public class MyContainer {
private int id;
private Map<String, List<Foo>> myContainer;
}
Теперь это сработает
Type myContainerType = new TypeToken<MyContainer>(){}.getType();
MyContainer myContainer = gson.fromJson(json, myContainerType);
System.out.println(myContainer);
Комментарии:
1. ошибки json — это просто опечатки, проблема в структуре Java, обновил вопрос
2. хм, хорошо, тогда я перепроверю. Возможно, я допустил ошибку новичка, поскольку это было первое, что я попробовал. Спасибо
3. на самом деле это немного отличается от того, что я пробовал, это также помещает id в map (что пока нормально) и работает. Еще раз спасибо. Почему моя первая версия не работает?
4. Возникла проблема. Это была проблема с именем поля. обновил мой ответ .. 🙂
5. Ах, хорошо, спасибо (боюсь, не могу принять дважды). преобразование json всегда выводит меня из себя.