2011-12-22 6 views
2

JSON Bing 결과를 구문 분석 할 때 Jackson을 사용하고 싶습니다. 사용 방법에 대해서는 약간 혼란 스럽습니다. 다음은 Bing으로부터받은 JSON의 예입니다.Jackson과 JSON Bing 결과 구문 분석

{ 
    "SearchResponse":{ 
     "Version":"2.2", 
     "Query":{ 
     "SearchTerms":"jackson json" 
     }, 
     "Web":{ 
     "Total":1010000, 
     "Offset":0, 
     "Results":[ 
      { 
       "Title":"Jackson JSON Processor - Home", 
       "Description":"News: 04-Nov-2011: Jackson 1.9.2 released; 23-Oct-2011: Jackson 1.9.1 released; 04-Oct-2011: Jackson 1.9.0 released (@JsonUnwrapped, value instantiators, value ...", 
       "Url":"http:\/\/jackson.codehaus.org\/", 
       "CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=jackson+json&d=4616347212909127&w=cbaf5322,11c785e8", 
       "DisplayUrl":"jackson.codehaus.org", 
       "DateTime":"2011-12-18T23:12:00Z", 
       "DeepLinks":"[...]" 
      } 
     ] 
     } 
    } 
} 

정말 결과 배열의 데이터 만 필요합니다. 이 배열은 0에서 n 개의 결과를 가질 수 있습니다. 누군가 Jackson을 "결과"를 비 직렬화하는 방법을 보여주는 예제를 제공 할 수 있습니까?

답변

10

먼저 JSON을 트리로 읽으십시오. ObjectMapper을 인스턴스화하고 readTree() 메소드를 사용하여 JSON을 읽습니다.

이렇게하면 JsonNode이됩니다. 배열을 다른 JsonNode 사이클과 같은 결과를 잡아 :

final ObjectMapper mapper = new ObjectMapper(); 

final JsonNode input = mapper.readTree(...); 

final JsonNode results = input.get("SearchResponse").get("Web").get("Results"); 

/* 
* Yes, this works: JsonNode implements Iterable<JsonNode>, and this will 
* cycle through array elements 
*/ 
for (final JsonNode element: results) { 
    // do whatever with array elements 
} 

는 또한 JSON 스키마 구현을 사용하여 입력을 확인하는 고려할 수 있습니다. 뻔뻔한 플러그 : https://github.com/fge/json-schema-validator

+0

는'results' 콜렉션처럼 보이지 않는, 그러나 당신은 그것을 반복하는 것 :

다음과 같은 코드를 사용할 수 있습니다, 당신은 "빙"최상위 클래스를 호출 가정. –

+1

예,'JsonNode'가'Iterable '을 구현하기 때문입니다. 컨테이너 (객체 또는 배열)에서 호출되면 배열 요소 (배열) 또는 속성 값 (객체)을 순환합니다. 다른 JSON 노드 유형에서는 기본 이터레이터가 비어 있습니다. – fge

+0

왜 ObjectMapper를 인스턴스화 한 다음 정적으로 참조합니까? – nagytech

3

잭슨을 직접 사용하려면 fge의 대답이 필요합니다.

json을 기반으로 pojos에 대해 작업하려면 json2pojo (https://github.com/wotifgroup/json2pojo - 내 뻔뻔한 플러그 :)를 사용해보십시오. 샘플 json을 가져 와서 자바 클래스.

final ObjectMapper mapper = new ObjectMapper(); 

final Bing bing = ObjectMapper.readValue(..., Bing.class); 

/* 
* you may need a null check on getResults depending on what the 
* Bing search returns for empty results. 
*/ 
for (Result r : bing.getSearchResponse().getWeb().getResults()) { 
    ... 
} 
+0

매우 멋진 추가 조각 - 공유해 주셔서 감사합니다. Jackson 데이터 바인딩을위한 좋은 동반자처럼 보입니다! – StaxMan