【发布时间】:2020-03-11 17:08:58
【问题描述】:
我有一个包含以下数据的 json 文件:
{
"Index" : {
"example_user" : {
"important_key" : "leave_me_alone",
"blah" : {
"more_stuff" : {
"ignore_this" : "and_this_too"
}
}
},
"another_user" : {
"blah" : {
"more_stuff" : {
"ignore_this" : "and_this_too"
}
}
},
"extra_person" : {
"blah" : {
"more_stuff" : {
"ignore_this" : "and_this_too"
}
}
}
}
}
如您所见,another_user 和 extra_person 中缺少 important_key。
我的目标是有条件地添加 "imporant_key" : "" 缺失但替换任何现有 important_key 值。我使用的程序是来自https://stedolan.github.io/jq/ 的JQ (1.6)。
在jqplay.org 上多次尝试失败并在互联网上深入(重新)搜索如何完成工作后,我才设法实现以下几点:
过滤器:.Index[]+={"important_key":"data"}
结果
{
"Index": {
"example_user": {
"important_key": "data",
"blah": {
"more_stuff": {
"ignore_this": "and_this_too"
}
}
},
"another_user": {
"blah": {
"more_stuff": {
"ignore_this": "and_this_too"
}
},
"important_key": "data"
},
"extra_person": {
"blah": {
"more_stuff": {
"ignore_this": "and_this_too"
}
},
"important_key": "data"
}
}
}
我知道+=(覆盖)写入了任何现有的键值(注意example_user)。我一直在尝试多个piped 过滤器/运算符,包括|= 和{ },但最后,上述结果是我能得到的最接近的结果。
(不幸的是,我似乎找不到 jqplay 代码 sn-p 我对所有东西都“疯狂”了)
【问题讨论】:
-
以下使用JREPL.BAT 的命令行适用于本示例。
jrepl.bat "{(\s*)(\x22blah\x22)" "{$1\x22important_key\x22: \x22\x22,$1$2" /M /X /F "Example.json" /O -尽管不使用 jq,但如果您对该解决方案感到满意,请告诉我,我可以写一个答案并解释非常简单的 JScript 正则表达式。正则表达式问题是 Stack Overflow 的主题。 -
我知道 dbenham 出色的 JREPL 脚本(我似乎无法在此处格式化文本),但由于 json 中有数组的工作示例,我(现在)希望这可以使用JQ,一个人。不过,我感谢您的意见,这就是为什么我会赞成您的评论。与此同时,我将继续希望采用 JQ 类型的方法。