【发布时间】:2019-09-10 16:17:58
【问题描述】:
使用jmesPath home page 上的示例,给定这个 JSON:
{
"locations": [
{"name": "Seattle", "state": "WA"},
{"name": "New York", "state": "NY"},
{"name": "Bellevue", "state": "WA"},
{"name": "Olympia", "state": "WA"}
]
}
我想转换 JSON 中的选择值,否则原封不动地返回 JSON。例如,假设我想把纽约市搬到夏威夷州,把西雅图搬到新墨西哥州。结果是:
{
"locations": [
{"name": "Seattle", "state": "NM"},
{"name": "New York", "state": "HI"},
{"name": "Bellevue", "state": "WA"},
{"name": "Olympia", "state": "WA"}
]
}
如果我在 JavaScript 中执行此操作,我想要做的是这样的:
let object = JSON.parse( raw_json );
object.locations[0].state = "NM";
object.locations[1].state = "HI";
raw_json = JSON.stringify( object );
诀窍是,如果我没有修改的 JSON 部分是要更改,表达式仍然按预期工作。理想情况下,我会使用表达式来代替硬编码的数组偏移量。但为简洁起见,我将其从 JavaScript 代码中省略了。
jmesPath 是否支持这个用例?如果有,语法是什么?
【问题讨论】:
-
如果我理解正确,您希望拥有 ` {"name": "New York", "state": "NY"} ` 和 ` {"name": "Seattle", "state" : "WA"} ` 嵌入到你的新 json 中?像这样:{“位置”:[ {“名称”:“西雅图”,“州”:“NM”},{“名称”:“纽约”,“州”:“HI”},{“名称” :“贝尔维尤”,“州”:“WA”},{“名称”:“奥林匹亚”,“州”:“WA”},{“名称”:“纽约”,“州”:“纽约”} , {"name": "西雅图", "state": "WA"} ] }
-
我希望表达式的输出与第二个代码块中显示的完全一样,与示例 javascript 代码(第三个块)的输出相同,这说明了我的逻辑努力完成。
-
我认为你不能更改 JMESPath 中的信息唯一的方法(我认为)是使用“合并”功能,我做了一个查询,但它是手工制作的,对我来说很脏您的问题没有动态解决方案,这是我的查询:
[locations[0].merge(@,{name: 'Seattle', state: 'NM'}),locations[1].merge(@,{name: 'New York', state: 'HI'}),locations[2],locations[3]]
标签: jmespath