Используйте gson для преобразования json, который должен быть массивом объектов, но не является

#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 всегда выводит меня из себя.