2017-06-05 86 views
0

我有以下Java对象:JSON只允许一个顶级值?

public class PersonDetails { 
    private Person person; 
    private List<Relative> relatives; 

    public PersonDetails() {}; 

    //getters and setters 

    } 

我想创建存根JSON这使我可以解析它使用GSON的Java对象。

当我尝试使用下面的JSON,但我得到的错误:

JSON only allows one top level value 

我怎样才能改变我的JSON,使其有效?

我目前的JSON:

{ 
    "Person": { 

     "id": "123", 
     "name: "stubName" 
    }, 
    [ 
    "Relative": { 

     "name": "relative1", 
     "relation: "mother" 

    } 

    ] 
} 

回答

4

我想你JSON结构不正确,GSON期待类似于:

{ 
    "person": { 
     // Person object 
    }, 
    "relatives": [ // Mind the plural! 
     { 
      //Relative object 
     }, 
     { 
      //another Relative object 
     } 
    ] 
} 

理由:通常任何JSON库都会检查你的豆类寻找公共设置者。如果你有一个类似setPerson(Person p)的setter,那么它将删除“set”前缀,然后将下一个字母(“P”变成“p”)的大小写切换,所以它会尝试创建一个Person对象,然后插入它在person属性中。

但是我再次觉得还有其他错误:错误指出你有一个JSON字符串,如:"{....},{....}",所以你有2个或更多的顶级(aka root)对象,这在JSON标准中是不允许的符号。

+0

这是我的问题,我的JSON结构不正确。 – java123999

0

“亲属”可能是你的字段名的名单将是一个JavaScript数组与你所需要的元素,像这样:

{ 
    "Person": { 

     "id": "123", 
     "name: "stubName" 
    }, 

    "Relatives": [{ 

      "name": "relative1", 
      "relation: "mother" 

     } ] 
} 
0

你应该使用验证器检查你的JSON。 JsonLint就是其中之一。

这会告诉你你的JSON无效。有几个问题。

首先,您已取消交易报价 - "name:"relation:

其次,还有一个更基本的问题,就是JSON对象只能包含一个命名字段的列表。你有:

{ 
    "field1" : "Value 1", 
    [ 
     { ... an array element ... } 
    ] 
} 

所以你试图有一个命名的字段和一个无名数组。这是不允许的。

您可以通过给数组字段的名称解决这个问题:

{ 
    "field1" : "Value 1", 
    "field2" : [ 
     { ... an array element ... } 
    ] 
} 

现在的顶级元素包含两个字段 - field1这是一个字符串,field2这是一个数组。