繁体   English   中英

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

[英]Gson and the argonauts - problem converting javascript array, to json string, to java pojo using gson. Trying to get my structures correct

这是我的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并执行我的相关操作。

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

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.stringifier从javascript数组创建json字符串。

任何帮助感激不尽。

编辑

我使用的解决方案是添加

public List<Person> personList;

到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}
    ]
}

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

您可以使用Container类,但这仅在您需要在人员列表中提供其他属性时才有意义。 如果不是这种情况,您也可以转换为java.util.List。 我认为您需要将list属性的“name”指定为JSON字符串中的根元素。 因此,例如,如果您的域对象是Person对象的List,那么您的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字符串为你创建List人员。

从Gson API文档:如果您反序列化的对象是ParameterizedType(即包含至少一个类型参数,可能是一个数组),那么您必须使用fromJson(String,Type)方法。 以下是Deserialing 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字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM