我有以下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"
}
]
}
答案 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"
} ]
}