Гсон и аргонавты - проблема с преобразованием массива javascript в строку json в java pojo с использованием gson. Попытка получить мои структуры правильно

Вот моя строка json, которую я использую в java:

json = 
[
    {"id":"123456","Data":"skill2","dmlcrud":false},
    {"id":"123456","Data":"skill3","dmlcrud":true},
    {"id":"123456","Data":"skill14","dmlcrud":true},
    {"id":"123321","Data":"skill1","dmlcrud":false},
    {"id":"123321","Data":"skill14","dmlcrud":false}
]

Теперь я хочу поместить его в коллекцию, поэтому в идеале/теоретически я хотел бы сделать:

List<Person> personList = new Gson().fromJson(json, Person.class);

и personList.size() будет = 5. Затем я бы просмотрел список personList и выполнил бы свои соответствующие действия.

Однако я понимаю, что мне нужно будет создать класс-контейнер, который сам содержит список людей? Итак, вместо (общедоступные геттеры/сеттеры удалены для краткости, возможно, там также синтаксическая ошибка).

Class Person {
   private integer id;
   private String Data;
   private Boolean dmlCrud ;
}

Мне действительно нужно что-то вроде ?

Class container{
   List<Person> personList;


   static class Person {
      private integer id;
      private String Data;
      private Boolean dmlCrud ;
   }
}

Однако тогда мне нужно будет изменить javascript json, чтобы он был чем-то другим? Что кажется довольно проблематичным, поскольку я создаю строку json из массива javascript, используя JSON.stringifier.

Любая помощь принята с благодарностью.

ИЗМЕНИТЬ

решение, которое я использовал, состояло в том, чтобы добавить

public List<Person> personList;

к классу человека и измените объект json так, чтобы он был

{ "personList" :
    [
        {"id":"123456","Data":"skill2","dmlcrud":false},
        {"id":"123456","Data":"skill3","dmlcrud":true},
        {"id":"123456","Data":"skill14","dmlcrud":true},
        {"id":"123321","Data":"skill1","dmlcrud":false},
        {"id":"123321","Data":"skill14","dmlcrud":false}
    ]
}

тогда вызов gson может быть

Person person = new Gson().fromJson(json, Person.class);

и данные, доступные в списке, например так

List<Person> personList = person.getPersonList();

ИЗМЕНИТЬ 2

Второе, лучшее решение — использовать этот массив json.

[
        {"id":"123456","Data":"skill2","dmlcrud":false},
        {"id":"123456","Data":"skill3","dmlcrud":true},
        {"id":"123456","Data":"skill14","dmlcrud":true},
        {"id":"123321","Data":"skill1","dmlcrud":false},
        {"id":"123321","Data":"skill14","dmlcrud":false}
]

а затем использовать

Type listType = new TypeToken<List<SkillsGsonTO>>() {}.getType();
List<Person> personList  = new Gson().fromJson(json,listType);
Person person1 = personList.get(0);

где используется исходный класс

Class Person {
       private integer id;
       private String Data;
       private Boolean dmlCrud ;
    }

person NimChimpsky    schedule 07.09.2010    source источник
comment
Ваш контейнерный класс может просто обернуть объекты java.util.List of Person +, возможно, некоторые другие свойства без необходимости включать статический внутренний класс Person.   -  person Jeroen Rosenberg    schedule 07.09.2010
comment
Большое спасибо. Хорошо, я, наверное, медлю, но как тогда это будет выглядеть?   -  person NimChimpsky    schedule 07.09.2010
comment
Вы можете взглянуть на ответ, который я разместил. По сути, я думаю, что вам нужен класс контейнера только в том случае, если есть другие свойства, которые вам нужно сохранить на уровне списка, например, вам нужен дополнительный флаг или что-то в этом роде. Во всех остальных случаях будет достаточно java.util.List и отдельного класса person.   -  person Jeroen Rosenberg    schedule 07.09.2010
comment
Так как же выглядит вызов gson?   -  person NimChimpsky    schedule 07.09.2010


Ответы (1)


Вы можете использовать класс Container, но это имеет смысл только в том случае, если вам нужно отправить дополнительные свойства в список людей. Если это не так, вы также можете преобразовать в java.util.List. Я думаю, вам нужно указать «имя» свойства списка в качестве корневого элемента в вашей строке JSON. Так, например, если ваш объект домена представляет собой список объектов Person, тогда ваш корневой элемент JSON: «persons» или «personList». Итак, ваш JSON может выглядеть примерно так:

"persons" : {[
     {"id":"123456","Data":"skill2","dmlcrud":false},
     {"id":"123456","Data":"skill3","dmlcrud":true},
     {"id":"123456","Data":"skill14","dmlcrud":true},
     {"id":"123321","Data":"skill1","dmlcrud":false},
     {"id":"123321","Data":"skill14","dmlcrud":false}
]}

Я мог бы немного ошибиться с синтаксисом, но это должно быть что-то похожее на это. Итак, подведем итог:

В вашем случае вы можете оставить свой класс Person нетронутым, и gson сможет создать для вас список людей из строки JSON, которую я предложил.

Из документов Gson API: если объект, который вы десериализуете, является ParameterizedType (т.е. содержит хотя бы один параметр типа и может быть массивом), вы должны использовать метод fromJson(String, Type). Вот пример десериализации ParameterizedType:

 Type listType = new TypeToken<List<String>>() {}.getType();

 Gson gson = new Gson();
 List<String> target2 = gson.fromJson(json, listType);

Итак, в вашем случае это будет:

Type listType = new TypeToken<List<Person>>() {}.getType();
List<Person> persons = new Gson().fromJson(json, listType);

где json - это ваша строка json, очевидно

person Jeroen Rosenberg    schedule 07.09.2010
comment
Я не понимаю, как будет создан список. Я согласен, что структура объекта json должна измениться, как вы предложили. Но я должен где-то объявить список либо в человеке, либо в контейнере...? - person NimChimpsky; 07.09.2010
comment
Я отредактировал свой ответ, чтобы быть более конкретным. В вашем случае вы можете использовать Type listType = new TypeToken‹List‹Person››() {}.getType(); и получите ссылку List‹Person› вызовом new Gson().fromJson(json, listType), где json — ваша строка json. Я надеюсь, что это проясняет это. - person Jeroen Rosenberg; 07.09.2010
comment
а, хорошо, это выглядит немного лучше, чем мой вариант, я попробую. Спасибо. Что это за Type listType = new TypeToken‹List‹Person››() {}.getType(); делаешь тогда? - person NimChimpsky; 07.09.2010
comment
Он получит экземпляр базового типа для универсального типа, см. google-gson.googlecode.com/svn/tags/1.5/docs/javadocs/ - person Jeroen Rosenberg; 07.09.2010
comment
с вашим предложением дополнительный человек в строке json не требуется, он принимает массив json. Я обновлю свой вопрос - person NimChimpsky; 07.09.2010
comment
Я никогда раньше не видел такого синтаксиса: {}.getType(); Можете ли вы предоставить какое-либо дополнительное объяснение того, что происходит? - person NimChimpsky; 07.09.2010
comment
TypeToken — это абстрактный класс. Таким образом, вы создаете анонимный класс и вызываете для него реализацию по умолчанию для getType(). - person Jeroen Rosenberg; 07.09.2010