JSON只允许一个顶级值?

时间:2017-06-05 10:20:10

标签: java json parsing gson

我有以下Java对象:

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

    public PersonDetails() {};

    //getters and setters

    }

我正在尝试为此创建Stub JSON,以便我可以使用GSON将其解析为Java对象。

当我尝试使用下面的JSON时,我收到错误:

JSON only allows one top level value

如何更改JSON以使其有效?

My Current JSON:

{
    "Person": {

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

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

     }

    ]
}

3 个答案:

答案 0 :(得分:5)

我认为您的JSON结构不正确,GSON期待类似:

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

基本原理:通常,任何JSON库都会检查您的bean,寻找公共setter。如果你有一个像setPerson(Person p)这样的setter,那么它将删除&#34; set&#34;前缀然后将切换下一个字母的大小写(&#34; P&#34;变为&#34; p&#34;),因此它将尝试创建一个Person对象,然后将其插入person属性。

但是我认为还有其他错误:该错误会抱怨您有一个JSON字符串,如:"{....},{....}",因此您有2个或更多顶级(又称根)对象,这是不允许的JSON标准符号。

答案 1 :(得分:2)

您应该使用验证器检查您的JSON。 JsonLint就是一个。

这将显示您的JSON无效。有几个问题。

首先,您有未公开的引号 - "name:"relation:

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

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

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

您可以通过为数组字段指定名称来解决此问题:

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

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

答案 2 :(得分:0)

'亲戚'可以是你的字段名称,列表将是一个包含你需要的元素的javascript数组,如下所示:

{
    "Person": {

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

    "Relatives": [{

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

         } ]
 }