Gson и аргонавты - проблема преобразования массива javascript в строку json в java pojo с использованием gson. Пытаясь привести мои структуры в порядок - PullRequest
5 голосов
/ 07 сентября 2010

Вот моя строка 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.

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

EDIT

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

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 ;
    }

1 Ответ

1 голос
/ 07 сентября 2010

Вы можете использовать класс Container, но это имеет смысл, только если вам нужно добавить дополнительные свойства в список людей. Если это не так, вы можете также преобразовать его в java.util.List. Я думаю, вам нужно указать «имя» свойства списка в качестве корневого элемента в строке JSON. Так, например, если вы являетесь объектом домена, это объект List of Person, тогда вашим корневым элементом JSON является: "Person" или "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.

Из документов API Gson: Если объект, который вы десериализуете, является 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, очевидно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...