输入JSON
[{
"Name":"Wolfenstein",
"24 Hour":"FALSE",
"Shop 1":"TRUE",
"Shop 2":"FALSE",
}]
并希望将所有“”和“TRUE”值分别更改为false
和true
。
[{
"Name":"Wolfenstein",
"24 Hour":false,
"Shop 1":true,
"Shop 2":false,
}]
作为奖励,我只想选择那些数组项目的关键字开始与“商店”,并有至少一个“商店”设置为“真”。jq过滤器应该用什么?
2条答案
按热度按时间uqcuzwp81#
您的总体需求还不清楚,但如果您真的想以您建议的方式更新任意JSON文本,您可能需要考虑使用
walk
。不过,为了简单起见,我假设您只有一个所显示的对象数组。让我们从将TRUE/TRUE更改为true/false的简单任务开始。这可以直接通过以下方式实现:
但由于您的“至少一个“商店”设置为“真”“的要求,它将有助于定义一个辅助功能:
因此,第一项任务可以通过以下方式完成:
现在我们可以走了假设你的jq有
any/2
,在你的总体需求的一种解释下,我们可以这样写:或者,如果仅更改“Shop”值:
如果你的jq没有
any/2
,那么请考虑升级;如果这不是一个选项,那么您可以使用reduce
编写自己(低效)版本。使用when/2
上述解决方案可以使用通用函数
when/2
进行简化,定义为:例如,上面的八行解决方案变成了四行,一旦熟悉了
when/2
,它可能也更容易阅读:6tqwzwtp2#
下面的代码将字符串“TRUE”替换为布尔值
true
,您可以将其传递给类似的表达式“TRUE”:要选择键以“Shop”开头并且至少有一个值设置为
true
的项目,您可以将结果通过管道传输到:或全部组合:
这里的内部
select
只选择对象中的那些属性,键以“Shop”开头,值为truthy。我们在这里假设,除了“TRUE”和“TRUE”之外,您没有其他值作为这些属性的开始。如果找到了任何这样的属性,则操作的结果对象with_entries
将不会为空,因此我们可以将其用作外部select
的条件-这将导致我们不感兴趣的对象被跳过。最后,map
是[.[]|f]
的同义词,这样我们就可以得到一个正确的json数组,而不是一个多个json对象的流。