2013-05-13 6 views
2

두 개의 다른 JSON 응답을 구문 분석하는 데 문제가 있습니다.다른 JSON 배열 응답

1 :

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

2 : 이것은 내가 편안 API에서 얻을 JSON 응답입니다 내 테스트 클라이언트에서 얻을이 응답. 목록에 일부 값을 추가 한 다음 출력을 테스트하기 위해 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"); 
} 

클라이언트 직렬화 코드 :

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" 포함 { } 의해 둘러싸인 것을 목적으로한다.

  • 둘째 것은 [ ]으로 둘러싸여 있기 때문에 직접 개체 목록입니다. 즉, 전체 2 차 응답은 1 차 응답의 필드와 같습니다. 그래서, 분명히 그들은 같은 방식으로 분석 할 수 없습니다

... 당신이 List을 사용하고 있기 때문에

제 2 회 한

가 올바르게 구문 분석되고 있으며,이 목록입니다. 그러나 1 일을 위해 당신은

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

지금 당신에게 ... 당신이 당신 JSON 응답을 나타내는 클래스 구조를 만들어야합니다, 즉 ... 다시 목록을 포함하는 필드를 포함하는 다른 클래스가 필요 귀하의 첫 번째 응답을 구문 분석 할 수 있습니다 :

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

을 당신이 는 기본적으로 이러한 가능한 JSON 요소입니다 ... 아주 간단하다, JSON 구문을 이해하기 위해 json.org에서 간단히 살펴 보도록하는 것이 좋습니다 :

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

편안한 API와 testClient가 모두 'List '을 (를) 반환하지만 응답이 다릅니다. 왜 그런지 몰라? –

+0

글쎄, 내가 말했듯이, API는 단지'List'를 반환하지 않습니다 ... 그것은'List' 인 필드를 포함하고있는 객체를 반환하고 있습니다.실제로 반환하는 구체적인 데이터 유형은'Map '이지만'List '이 아닙니다 ...이 API는 사용자가 제어하지 않는다고 가정합니다. REST API가 이러한 방식으로 데이터를 반환하는 것은 매우 일반적인 일이며 항상 필드 "응답"(또는 "gears") 또는 그와 유사한 객체가 포함 된 객체에 포함되어 있습니다. – MikO

+0

API가 내 것이고 List 를 돌려주고 있습니다. 그래서 나는 혼란스러워합니다. –