代码之家  ›  专栏  ›  技术社区  ›  NimChimpsky

Gson和argonauts—使用Gson将javascript数组转换为json字符串并转换为java pojo时出现问题。试着纠正我的结构

  •  5
  • NimChimpsky  · 技术社区  · 14 年前

    这是我用java访问的json字符串:

    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中循环并执行相关的操作。

    但是,我的理解是,我需要创建一个容器类,它本身包含person list?因此,与其(为了简洁起见,删除了public 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修改为不同的东西?这似乎有点问题,因为我是从javascript数组创建json字符串,使用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();
    

    第二个更好的解决方案是使用这个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 回复  |  直到 14 年前
        1
  •  1
  •   Jeroen Rosenberg    14 年前

    您可以使用容器类,但这只有在需要在人员列表上提供其他属性时才有意义。如果不是这样,您可以转换为java.util.List也。我认为您需要将list属性的“name”指定为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文档: 如果反序列化的对象是parameteredType(即至少包含一个类型参数,并且可能是数组),则必须使用fromJson(String,type)方法。以下是反序列化ParameteredType的示例:

     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字符串