GSON序列化子对象

时间:2018-04-22 08:50:48

标签: java json gson

我想序列化这个JSON结构:

{  
   "name":"name 1",
   "number":1,
   "standing":[  
      {  
         "subRank":1,
         "subname":"test"
      },
      {  
         "subRank":2,
         "subname":"Test2"
      }]
}

我想使用像这样的对象关联:

public class ParentClass{
    String name;
    String number;
    List<SubClass> SubClassList;
}

public class SubClass{
    String subRank;
    String subname;
}

我尝试使用此代码:

Type type = new TypeToken<List<ParentClass>>() {}.getType();
ArrayList<ParentClass> parentClassList= new ArrayList<>();
parentClassList= gson.fromJson(jsonContent, type);

但我有这个例外:

  

线程“main”com.google.gson.JsonSyntaxException中的异常:   java.lang.IllegalStateException:预期BEGIN_ARRAY但是   BEGIN_OBJECT在第1行第2列路径$

感谢您的帮助:)

4 个答案:

答案 0 :(得分:0)

首先,您的json结构无效。

从下面删除最后一个逗号

     "subname":"Test2",

并且您的json结构不是列表,它是对象结构,您尝试将其解析为列表。

将您的代码更改为:

ParentClass parentClassList= gson.fromJson(data.get(0), type);

或者使用“[]”符号将json结构更改为数组换行。

这适用于我:

Gson gson = new Gson();

Type type = new TypeToken<ParentClass>() {}.getType();
ParentClass parentClassList= gson.fromJson(data, type);

System.out.println(parentClassList.name);

JSON:

{"name":"name 1","number":1,"standing":[{"subRank":1,"subname":"test"},{"subRank":2,"subname":"Test2"}]}

答案 1 :(得分:0)

您正在尝试的方法是反序列化集合(here,您可以阅读一个非常好的示例)。但这不是你的情况。

如果你想序列化这个json:

{  
   "name":"name 1",
   "number":1,
   "standing":[  
      {  
         "subRank":1,
         "subname":"test"
      },
      {  
         "subRank":2,
         "subname":"Test2"
      }]
}

您的课程结构不正确。

首先,您的numbersubRank不是String

其次,必须将此List<SubClass> SubClassList;称为standing

所以,父类将是:

public class ParentClass {
    String name;
    Number number;
    Collection<SubClass> standing;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Number getNumber() {
        return number;
    }

    public void setNumber(Number number) {
        this.number = number;
    }

    public Collection<SubClass> getStanding() {
        return standing;
    }

    public void setStanding(Collection<SubClass> standing) {
        this.standing = standing;
    }
}

子类:

public class SubClass {
    Number subRank;
    String subname;

    public Number getSubRank() {
        return subRank;
    }

    public void setSubRank(Number subRank) {
        this.subRank = subRank;
    }

    public String getSubname() {
        return subname;
    }

    public void setSubname(String subname) {
        this.subname = subname;
    }
}

如果你想测试:

public class Test {

    public static void main (String args[])
    {
        Gson gson = new Gson();

        SubClass sc = new SubClass();
        sc.setSubRank(1);
        sc.setSubname(("test"));

        SubClass sc2 = new SubClass();
        sc2.setSubRank(2);
        sc2.setSubname(("Test2"));
        LinkedList<SubClass> list= new LinkedList<>();

        list.add(sc);
        list.add(sc2);


        ParentClass pc = new ParentClass();
        pc.setName("name 1");
        pc.setNumber(1);
        pc.setStanding(list);

        System.out.println(gson.toJson(pc));
    }
}

答案 2 :(得分:0)

我和GSON做了非常相似的事情。

  • 您的排名不是清单。 GSON将它们解析为数组。
  • 如果您的班级的成员名称与您的json不同,则需要对其进行注释。

以下示例。希望它指出你正确的方向......

public class ParentClass{
    String name;
    String number;
    @SerializedName("standing")
    SubClass[] SubClassList;
}

public class SubClass{
    String subRank;
    String subname;
}

答案 3 :(得分:0)

我这样解决了我的情况:

JSON

{  
   "name":"name 1",
   "number":1,
   "standing":[  
      {  
         "subRank":1,
         "subname":"test"
      },
      {  
         "subRank":2,
         "subname":"Test2"
      }]
}

POJO

public class ParentClass{
    String name;
    int number;
    List<SubClass> standing;
}

public class SubClass{
    int subRank;
    String subname;
}

JAVA

Gson gson = new Gson();
Type type = new TypeToken<ParentClass>() {}.getType();
ParentClass parentClassList= gson.fromJson(data, type);

非常感谢@Emre,@ Christoph-Tobias Schenke和@Davide Patti