2012-09-11 4 views
6

다음 JSON이 주어지면 postal_code (long_name 또는 short_name)를 추출하고 싶습니다. 나는 JsonSlurper를 변수에 넣고 find/contains/etc를 사용하여 다양한 쿼리를 시도했다. "유형"에 "postal_code"가있는 노드를 가져 오지 만 알아낼 수는 없습니다. 어떤 도움이라도 대단히 감사합니다.Groovy JSON/GPath 쿼리

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Jefferson Ave", 
       "short_name" : "Jefferson Ave", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "North Newport News", 
       "short_name" : "North Newport News", 
       "types" : [ "neighborhood", "political" ] 
      }, 
      { 
       "long_name" : "Newport News", 
       "short_name" : "Newport News", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Virginia", 
       "short_name" : "VA", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "23608", 
       "short_name" : "23608", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "Jefferson Ave & Denbigh Blvd, Newport News, VA 23608, USA", 
     "geometry" : { 
      "location" : { 
       "lat" : 37.13852930, 
       "lng" : -76.52013079999999 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 37.13987828029151, 
        "lng" : -76.51878181970848 
       }, 
       "southwest" : { 
        "lat" : 37.13718031970851, 
        "lng" : -76.52147978029149 
       } 
      } 
     }, 
     "types" : [ "intersection" ] 
     } 
    ], 
    "status" : "OK" 
} 

답변

9

다음은 postal_code 유형의 노드를 찾아야합니다. results 또는 address_components에 여러 개의 목록 항목이있는 경우 인덱싱 된 액세스를 반복하여 적절하게 조정해야하지만 잘하면이 도움이됩니다.

import groovy.json.* 

def text = ''' 
{ 
    "results" : [ 
<omitted rest to save space> 
.... 
} 
''' 

def json = new JsonSlurper().parseText(text) 

def theNode = json.results[0] 
        .address_components 
        .find { it.types[0] == 'postal_code' } 

assert '23608' == theNode.long_name 
+3

@GaryWhite +1 요한이 말한대로, 여러 결과 나 우편 번호가있는 경우,이 작업을해야한다 :'목록 코드 =의 json.results.address_components * .findAll {it.types에서 '우편 _ 번호'}. flatten(). long_name' –