【问题标题】:JSON only allows one top level value?JSON 只允许一个顶级值?
【发布时间】:2017-06-05 10:20:09
【问题描述】:

我有以下Java 对象:

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"

     }

    ]
}

【问题讨论】:

  • 如果您尝试添加一个带有数据的打字稿文件但错误地将文件命名为 .json,则会收到此错误。

标签: java json parsing gson


【解决方案1】:

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

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

基本原理:一般来说,任何 JSON 库都会检查您的 bean 以寻找公共设置器。如果你有一个像setPerson(Person p) 这样的setter,那么它会删除“set”前缀,然后会切换下一个字母的大小写(“P”变成“p”),所以它会尝试创建一个Person 对象然后将其插入person 属性中。

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

【讨论】:

  • 这是我的问题,我的 JSON 结构不正确。
【解决方案2】:

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

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

首先你有未闭合的引号 - "name:"relation:

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    {
        "Person": {
    
            "id": "123",
            "name: "stubName"
        },
    
        "Relatives": [{
    
                "name": "relative1",
                "relation: "mother"
    
             } ]
     }
    

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 2019-06-29
      相关资源
      最近更新 更多