Gson和argonauts - 使用gson将javascript数组转换为json字符串到java pojo的问题.试图让我的结构正确

Nim*_*sky 5 javascript java json 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}
]
Run Code Online (Sandbox Code Playgroud)

我现在想把它放在一个集合中,理想上/理论上我想做:

List<Person> personList = new Gson().fromJson(json, Person.class);
Run Code Online (Sandbox Code Playgroud)

和personList.size()将= 5.然后我将遍历personList并执行我的相关操作.

但是,我的理解是我需要创建一个容器类,它本身包含人员列表?所以不是为了简洁而删除公共getter/setter,也可能是语法错误.

Class Person {
   private integer id;
   private String Data;
   private Boolean dmlCrud ;
}
Run Code Online (Sandbox Code Playgroud)

我真的需要类似的东西吗?

Class container{
   List<Person> personList;


   static class Person {
      private integer id;
      private String Data;
      private Boolean dmlCrud ;
   }
}
Run Code Online (Sandbox Code Playgroud)

然而,我需要改变javascript json是一些不同的东西吗?这似乎很有问题,因为我使用JSON.stringifier从javascript数组创建json字符串.

任何帮助感激不尽.

编辑

我使用的解决方案是添加

public List<Person> personList;
Run Code Online (Sandbox Code Playgroud)

到person类并改变它的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}
    ]
}
Run Code Online (Sandbox Code Playgroud)

那么gson调用就可以了

Person person = new Gson().fromJson(json, Person.class);
Run Code Online (Sandbox Code Playgroud)

以及如此列表中访问的数据

List<Person> personList = person.getPersonList();
Run Code Online (Sandbox Code Playgroud)

编辑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}
]
Run Code Online (Sandbox Code Playgroud)

然后使用

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

使用原始类的位置

Class Person {
       private integer id;
       private String Data;
       private Boolean dmlCrud ;
    }
Run Code Online (Sandbox Code Playgroud)

Jer*_*erg 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}
]}
Run Code Online (Sandbox Code Playgroud)

我的语法可能有点偏差,但它应该与此类似。总结一下:

在你的情况下,你可以保持 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);
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下它将是:

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

其中 json 显然是你的 json 字符串