2013-03-12 6 views
2

Android REST 클라이언트를 개발 중입니다. JSON을 데이터 교환 형식으로 사용하므로 Jackson 파서를 사용합니다. 간단한 배열처럼 서버에서 다른 Json 응답을 얻습니다.배열의 JSON 배열을 Jackson의 LinkedHashMap으로 구문 분석 할 수 없습니다.

{"user_id":"332","user_role":"1"} 

또는 다른 것. 이 모든 것들 내가 LinkedHashMap<String, Object>으로 분석하고 모든 것을 완벽하게 작동하지만 서버에서이 응답 왔을 때 :

[ { "user_id":"352", 
    "user_role":"expert", 
    "name":"Test 12-18", 
    "description":"Test" }, 

    { "user_id":"263", 
    "user_role":"novice lab", 
    "name":"Tom's Desk", 
    "description":"Desk"} 
] 

내가 널 가지고 : {} parsing.Here 잭슨 내가 사용하는 내 코드 후를 :

ObjectMapper mapParametersToJSON = new ObjectMapper(); 
String serverResponseBody = responseFromServer.getBody(); 
LinkedHashMap<String, Object> resultofOperation = new LinkedHashMap<String, 
    Object>(); 
TypeReference<LinkedHashMap<String,Object>> genericTypeReferenceInformation = new 
    TypeReference<LinkedHashMap<String,Object>>() {}; 
    try { 
    resultofOperation = mapParametersToJSON.readValue(serverResponseBody, 
     genericTypeReferenceInformation); 

왜 잭슨이 이것을 분석하지 못했습니다? 이 문제를 어떻게 해결할 수 있습니까?

+1

기본 Json Parser Api를 사용하지 않는 이유는 무엇입니까? –

답변

4

첫 번째 JSON은지도 또는 개체입니다. 두 번째 배열입니다. 배열을 파싱하지 않고지도를 파싱합니다.

당신은 같은 것을 할 필요가 : 대답 here

List<MyClass> myObjects = mapper.readValue(jsonInput, new TypeReference<List<MyClass>>(){}); 

거의 동일한 질문을.

+0

Ok.But JSON 유형을 결정하는 방법이 있습니다 : 객체 또는 배열 순서로 mapper.readvalue를 작성할 때 if/else를 사용할 수 있습니까? – MainstreamDeveloper00

+0

프로덕션에서는 Jackson을 사용하지 않았지만'JsonNode'에는 isArray() 메소드가 있습니다. 내 이해는 맵퍼를 사용할 때 일반적으로 매핑 대상을 알고 있다는 것입니다. 그렇지 않다면 아마도 DOM을 사용할 것입니다. – 323go

+2

Mapper를 사용하여'JsonNode'에 바인딩 할 수도 있습니다 :'JsonNode root = mapper.readValueAsTree (source);' – StaxMan

0

는 JSON에서 {"key": "value"}는 객체이며, ["this", "that"]은 배열입니다.

그래서, 당신은 당신이 List<Map<Key, Value>> 같은 것을 사용해야 객체의 배열을 받고있는 경우이다.

0

[] 구성을 Map 참조로 변환 할 수 없으므로 오류가 발생했습니다. 주소는 List 또는 배열입니다.

ObjectMapper objectMapper = new ObjectMapper(); 

List<Map<String,String>> parsedResult = objectMapper.reader(CollectionType.construct(LinkedList.class, MapType.construct(LinkedHashMap.class, SimpleType.construct(String.class), SimpleType.construct(String.class)))).readValue(serverResponseBody); 

//if you need the one result map 
Map<String, String> resultMap = new LinkedHashMap<String, String>(); 

for (Map<String, String> map: parsedResult){ 
    resultMap.putAll(map); 
} 
5

기타 문제를 제안했지만, 솔루션은 조금 불완전 : 내가 추천 할 것입니다

이 방법으로 그것을 뭔가. 당신이, 당신이 중 하나를 수행 할 수 있습니다 바인드 java.lang.Object에 JSON 개체 및 배열을 처리해야하는 경우, 유형 확인 :

Object stuff = objectMapper.readValue(json, Object.class); 

를 당신은 얻을 것이다 중 하나 List 또는 Map (특히, ArrayList 또는 LinkedHashMap 기본적으로,이 기본값이 할 수있는 변경 될 수 있음).

또는 당신은 JsonNode와 JSON 나무를 수행 할 수 있습니다

JsonNode root = objectMapper.readTree(json); 
if (root.isObject()) { // JSON Object 
} else if (root.isArray()) { ... 
} 

후자는 종종 더 편리합니다.

하나 좋은 점은 여전히 ​​예를 들어,이 중 일반 POJO를 만들 수 있다는 것입니다 :

을 경우 (root.isObject()) { 을 MyObject 산부인과 = objectMapper.treeToValue (MyObject.class); } // 또는 Object와, objectMapper.convertValue(ob, MyObject.class)

그래서 당신도 다른 유형에 대해 서로 다른 처리를 할 수 있습니다 사용; 서로 다른 표현을 반복합니다.