在给定JSON的情况下,使用jmesPath home page上的示例:
{
"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结构进行必要的嵌入,而无需执行更多的转换,如果我未修改的JSON部分是要进行更改,该表达式仍会按预期工作。理想情况下,我将使用表达式代替硬编码的数组偏移量。但是为了简洁起见,我将其保留在JavaScript代码之外。
jmesPath是否支持此用例?如果是这样,语法是什么?
答案 0 :(得分:0)
您需要使用迭代方法,并在每次迭代中处理一个特定的城市。另外,您可以使用合并功能将现有信息保留在每个位置项目下。
下面是两次迭代的示例。您可以轻松地将结果扩展到更多城市。
{ "locations": [
// lines below replace states for cities of Seattle and New York.
merge( locations[? name == 'Seattle' ] | [0] , {state: 'NM'}),
merge( locations[? name == 'New York' ] | [0] , {state: 'HI'}),
// this line includes other cities as they are
locations[? ! contains( ['Seattle', 'New York'], name) ],
// use the flatten operator to order all locations at the same level
][]
}