2013-05-13 90 views
2

解析兩個不同的JSON響應時出現問題。不同的JSON數組響應

1:這是JSON響應我從一個RESTful API獲取:

{ 
    "gear": [ 
    { 
     "idGear": "1", 
     "name": "Nosilec za kolesa", 
     "year": "2005", 
     "price": "777.0" 
    }, { 
     "idGear": "2", 
     "name": "Stresni nosilci", 
     "year": "1983", 
     "price": "40.0" 
    } 
    ] 
} 

2:這種反應,我從我的測試客戶端獲取。我在列表中添加了一些值,然後使用gson.toJson來測試輸出。

[ 
    { 
    "idGear": "1", 
    "name": "lala", 
    "year": 2000, 
    "price": 15.0 
    }, { 
    "idGear": "2", 
    "name": "lala2", 
    "year": 2000, 
    "price": 125.0 
    } 
] 

他們都是有效的,但第二個成功反序列化到對象是這樣的:

Type listType = new TypeToken<List<Gear>>() {}.getType(); 
List<Gear> gears= (List<Gear>) gson.fromJson(json, listType); 

有了第一個,我試圖反序列化方式相同,但我得到的錯誤。


編輯

API方法:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public List<Gear> getGear() { 
    List<Gear> gears = gearDAO.getGears(); 
    if (!gears.isEmpty()) { 
    return gears; 
    } else 
    throw new RuntimeException("No gears"); 
} 

CLIENT序列化代碼:

List<Gear> list = new ArrayList<Gear>(); 
Gear o = new Gear(); 
o.setPrice(15); 
o.setYear(2000); 
o.setName("asds"); 
Type listTypes = new TypeToken<List<Gear>>() {}.getType(); 
gson.toJson(list, listTypes); 

回答

8

的JSON響應是不同的!

  • 第一個是一個對象,由{ },其中包含一個字段"gear"即反過來對象的列表,通過[ ]包圍。

  • 第二個是直接的對象列表,因爲它被[ ]包圍。即,整個第二響應等同於第一響應中的字段。

所以,很顯然,他們無法以同樣的方式解析...

第二屆一個被解析正確的,因爲你使用的是List,它是一個列表。但對於第一個1,你需要包含又包含列表中的另一場...類也就是說,你只需要創建一個類結構,它表示你的JSON響應...

public class Response {  
    private List<Gear> gears;   
    //getters & setters 
} 

現在你可以分析你與第一次迴應:

Gson gson = new Gson(); 
Response response = gson.fromJson(json, Response .class); 
List<Gear> gears = response.getGears(); 

我建議你採取了簡單的介紹一下json.org以瞭解JSON的語法,這是非常簡單的... 基本上這些都是可能的JSON元素:

object 
    {} 
    { members } 
members 
    pair 
    pair , members 
pair 
    string : value 
array 
    [] 
    [ elements ] 
elements 
    value 
    value , elements 
value 
    string 
    number 
    object 
    array 
    true 
    false 
    null 
+0

restful api和testClient都返回'List ',但響應不同。我不知道爲什麼? – 2013-05-13 11:43:51

+0

那麼,正如我所說的,API不僅僅是返回一個'List' ...它返回一個包含一個List的對象。實際上,它返回的具體數據類型是一個'Map ',但不是'List '......我假設這個API不受你控制,對吧?通常情況下,REST API以這種方式返回數據,總是包含在一個帶有「'response」字段的對象中(在你的情況下爲「gears」)或類似的東西... – MikO 2013-05-13 11:51:06

+0

API是我的,它正在返回列表,所以這就是爲什麼我困惑。 – 2013-05-13 12:34:54