【问题标题】:Groovy JSON/GPath queryGroovy JSON/GPath 查询
【发布时间】:2012-09-11 22:15:07
【问题描述】:

鉴于以下 JSON,我想提取 postal_code(long_name 或 short_name)。我使用 JsonSlurper 将其摄取到变量中,并尝试使用 find/contains/etc 进行各种查询。抓取在其“类型”中具有“postal_code”但无法弄清楚的节点。非常感谢任何帮助。

{
   "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"
}

【问题讨论】:

    标签: json groovy gpath


    【解决方案1】:

    下面应该找到 postal_code 类型的节点。如果 resultsaddress_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
    

    【讨论】:

    • @GaryWhite +1 如果正如约翰所说,您有多个结果或邮政编码,这应该可以:List codes = json.results.address_components*.findAll { 'postal_code' in it.types }.flatten().long_name
    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多