如何筛选嵌套JSON数组中likes值大于50的数据行?
嘿,这个问题我太熟悉了!要筛选嵌套JSON数组里likes字段值大于50的数据,得看你用什么工具来处理——我给你分享两个最常用的场景,都是日常处理JSON的利器:
用Python处理
Python的json模块可以轻松搞定这个需求,不管你是单条数据还是多条数据组成的数组,都能灵活处理。
单条数据的情况
比如你给出的示例JSON,我们可以解析后筛选locations中符合条件的元素,同时保留外层的id和name:
import json # 你的示例JSON数据(这里我多加了一个likes=40的条目方便对比) json_data = ''' { "id":2, "name":"TEST", "locations":[ { "cityName":"NEW YORK", "lat":123, "lon":456, "likes":1000, "dislikes":5 }, { "cityName":"LONDON", "lat":789, "lon":101, "likes":40, "dislikes":20 } ] } ''' # 把JSON字符串转成Python字典 data = json.loads(json_data) # 筛选locations中likes>50的条目,重新组织成新的JSON结构 filtered_result = { "id": data["id"], "name": data["name"], "locations": [loc for loc in data["locations"] if loc["likes"] > 50] } # 格式化输出结果 print(json.dumps(filtered_result, indent=2))
运行后会输出:
{ "id": 2, "name": "TEST", "locations": [ { "cityName": "NEW YORK", "lat": 123, "lon": 456, "likes": 1000, "dislikes": 5 } ] }
多条数据行的情况
如果你的原始数据是多个数据行组成的数组(比如批量数据),可以在外层再套一层列表推导,还能可选过滤掉筛选后locations为空的行:
import json # 多条数据的示例数组 json_array_data = ''' [ { "id":2, "name":"TEST", "locations":[ { "cityName":"NEW YORK", "likes":1000 }, { "cityName":"LONDON", "likes":40 } ] }, { "id":3, "name":"ANOTHER TEST", "locations":[ { "cityName":"PARIS", "likes":60 }, { "cityName":"TOKYO", "likes":30 } ] }, { "id":4, "name":"EMPTY TEST", "locations":[ { "cityName":"SYDNEY", "likes":30 } ] } ] ''' data_array = json.loads(json_array_data) filtered_rows = [ { "id": row["id"], "name": row["name"], "locations": [loc for loc in row["locations"] if loc["likes"] > 50] } for row in data_array # 可选:去掉筛选后locations为空的行 if any(loc["likes"] > 50 for loc in row["locations"]) ] print(json.dumps(filtered_rows, indent=2))
这段代码会自动排除id=4的那条数据,因为它的locations里没有符合条件的元素。
用jq命令行工具处理
如果你习惯用命令行处理JSON,jq绝对是首选工具,语法简洁高效。
单条数据的情况
直接用map(select(...))筛选locations数组,并用|=把结果赋值回原字段:
echo '{"id":2,"name":"TEST","locations":[{"cityName":"NEW YORK","lat":123,"lon":456,"likes":1000,"dislikes":5},{"cityName":"LONDON","lat":789,"lon":101,"likes":40,"dislikes":20}]}' | jq '.locations |= map(select(.likes > 50))'
多条数据行的情况
外层用map()遍历每个数据行,同样可以加select(.locations != [])去掉空的行:
echo '[ {"id":2,"name":"TEST","locations":[{"cityName":"NEW YORK","likes":1000},{"cityName":"LONDON","likes":40}]}, {"id":3,"name":"ANOTHER TEST","locations":[{"cityName":"PARIS","likes":60},{"cityName":"TOKYO","likes":30}]}, {"id":4,"name":"EMPTY TEST","locations":[{"cityName":"SYDNEY","likes":30}]} ]' | jq 'map( .locations |= map(select(.likes >50)) | select(.locations != []) )'
内容的提问来源于stack exchange,提问作者Probine Business
相关产品推荐
相关产品推荐

