使用Json Path筛选字符串列表重构谷歌地理编码地址
问题:通过JSONPath重构谷歌地理编码地址组件
我有一段谷歌地理编码服务返回的JSON子集:
{ "address_components": [ { "long_name": "43a", "short_name": "43a", "types": [ "street_number" ] }, { "long_name": "South Audley Street", "short_name": "S Audley St", "types": [ "route" ] }, { "long_name": "London", "short_name": "London", "types": [ "postal_town" ] }, { "long_name": "Greater London", "short_name": "Greater London", "types": [ "administrative_area_level_2", "political" ] }, { "long_name": "England", "short_name": "England", "types": [ "administrative_area_level_1", "political" ] }, { "long_name": "United Kingdom", "short_name": "GB", "types": [ "country", "political" ] }, { "long_name": "W1K 2PU", "short_name": "W1K 2PU", "types": [ "postal_code" ] } ] }
需要用JSONPath查询将地址组件重构为以下多行字符串:
43a S Audley St London W1K 2PU United Kingdom
我尝试过用筛选表达式和in操作符对types属性筛选,但一直没成功,求技术帮助。
解决方案
步骤1:拆分各地址段的JSONPath查询
要得到目标格式,需要分三次查询提取不同的地址部分:
第一行(门牌号+街道):筛选
types包含street_number或route的组件,取short_name$..address_components[?(@.types in ['street_number','route'])].short_name执行后得到数组:
["43a", "S Audley St"],直接拼接成字符串即可。第二行(城镇+邮编):筛选
types包含postal_town或postal_code的组件,取short_name$..address_components[?(@.types in ['postal_town','postal_code'])].short_name执行后得到数组:
["London", "W1K 2PU"],拼接成字符串。第三行(国家):筛选
types包含country的组件,取long_name(需要全称而非缩写)$..address_components[?(@.types in ['country'])].long_name执行后得到数组:
["United Kingdom"],直接取该值。
步骤2:拼接结果
将三次查询得到的结果分别拼接成字符串,再按换行符组合,即可得到目标格式。
注意事项
- 不同JSONPath实现对
in操作符的支持可能有差异,部分实现需要用contains函数替代,比如:$..address_components[?(@.types contains 'street_number' || @.types contains 'route')].short_name - 若使用支持字符串拼接的JSONPath工具(如Jayway JsonPath),可以直接通过表达式完成拼接,但多数基础工具需要在查询后手动处理拼接逻辑。
内容的提问来源于stack exchange,提问作者Mammt
相关产品推荐
相关产品推荐

