如何使用JSONPath一次性从嵌套数组提取指定键的对象?
使用jsonpath从嵌套数组中提取指定字段的对象
问题场景
需要从给定的嵌套对象数组中,一次性提取每个元素里payload.data下的humidity和temperature字段,组合成新的对象数组,避免多次查询。
示例数据
[ { "payload": { "data": { "battery": { "name": "Battery", "value": 45.95860848091411, "units": "%", "precision": 0 }, "humidity": { "name": "Humidity", "value": 27.84230269716663, "units": "%", "precision": 2 }, "temperature": { "name": "Temperature", "value": 4.3758105786304675, "units": "°", "precision": 2 } }, "timeStamp": 1657356781, "deviceId": "172849" }, "timeStamp": "2022-07-09T07:53:00.000Z" }, { "payload": { "data": { "battery": { "name": "Battery", "value": 15.088388240727735, "units": "%", "precision": 0 }, "humidity": { "name": "Humidity", "value": 55.695616989217875, "units": "%", "precision": 2 }, "temperature": { "name": "Temperature", "value": 22.08980374920423, "units": "°", "precision": 2 } }, "timeStamp": 1657356840, "deviceId": "172849" }, "timeStamp": "2022-07-09T07:55:59.000Z" } ]
期望结果
[ { "humidity": { "name": "Humidity", "value": 27.84230269716663, "units": "%", "precision": 2 }, "temperature": { "name": "Temperature", "value": 4.3758105786304675, "units": "°", "precision": 2 } }, { "humidity": { "name": "Humidity", "value": 55.695616989217875, "units": "%", "precision": 2 }, "temperature": { "name": "Temperature", "value": 22.08980374920423, "units": "°", "precision": 2 } } ]
解决方案
jsonpath本身擅长匹配节点,结合数组的map方法可以一次性完成提取和转换:
const jp = require('jsonpath'); // 假设data是你的示例数据数组 const result = jp.query(data, '$..payload.data').map(item => ({ humidity: item.humidity, temperature: item.temperature }));
说明
$..payload.data这个jsonpath表达式会匹配所有层级下的payload.data对象,返回包含所有目标data对象的数组;- 用
map遍历每个data对象,只保留humidity和temperature字段,直接生成符合要求的新对象数组; - 你之前尝试的
$..payload.data['humidity']['temperature']错误原因是:humidity和temperature是同级字段,并非嵌套关系,该表达式试图从humidity对象里查找temperature属性,自然无法匹配结果。
内容的提问来源于stack exchange,提问作者pb46
相关产品推荐
相关产品推荐

