2017-06-05 119 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這是一個數組。