替换所有的“;“真的”;及;假;json中的值及其各自的布尔值

替换所有的“;“真的”;及;假;json中的值及其各自的布尔值,json,jq,Json,Jq,我有这个输入 [{ "Name":"Wolfenstein", "24 Hour":"FALSE", "Shop 1":"TRUE", "Shop 2":"FALSE", }] 并希望将所有“FALSE”和“TRUE”值分别更改为FALSE和TRUE [{ "Name":"Wolfenstein", "24 Hour":false, "Shop 1":true, "Shop 2":false, }] 作为奖励,我只想选择那些其键以“Shop”开

我有这个输入

[{
   "Name":"Wolfenstein",
   "24 Hour":"FALSE",
   "Shop 1":"TRUE",
   "Shop 2":"FALSE",
}]
并希望将所有“FALSE”和“TRUE”值分别更改为
FALSE
TRUE

[{
   "Name":"Wolfenstein",
   "24 Hour":false,
   "Shop 1":true,
   "Shop 2":false,
}]
作为奖励,我只想选择那些其键以“Shop”开头并且至少在“Shop”上设置为“TRUE”的数组项。
使用JQ过滤器是什么?

您的总体需求不清楚,但如果您真的想按照您建议的方式更新任意JSON文本,您可能需要考虑使用<代码> Wave。不过,为了简单起见,我假设您只是拥有一个显示的对象数组

让我们从将真/假更改为真/假的简单任务开始。这可以通过以下方式直接实现:

map( map_values(if . == "TRUE" then true 
                elif . == "FALSE" then false
                else .
                end) )
但由于您的“至少一个“车间”设置为“真”要求,因此定义一个辅助功能将很有帮助:

 def toboolean:
   if . == "TRUE" then true 
   elif . == "FALSE" then false
   else .
   end;
因此,第一项任务可以通过以下方式完成:

map(map_values(toboolean))
现在我们可以走了。假设您的jq有
any/2
,根据您的总体需求的一种解释,我们可以写:

map( if any( to_entries[];
             (.key|startswith("Shop")) and .value=="TRUE" )
     then map_values(toboolean)
     else .
     end)
或者,如果仅更改“车间”值:

map( if any( to_entries[];
             (.key|startswith("Shop")) and .value=="TRUE" )
     then with_entries( if .key|startswith("Shop")
                        then .value |= toboolean
                        else .
                        end)
     else .
     end)

如果您的JQ没有<代码>任何/ 2 ,请考虑升级;如果这不是一个选项,您可以使用

reduce
编写自己的(低效)版本

使用when/2 可以使用通用函数
when/2
简化上述解决方案,该函数定义为:

def when(filter; action): if filter//null then action else . end;
例如,上面的八行解决方案变成了这四行,当/2时,一旦熟悉了
,也可能更容易阅读:

map( when( any( to_entries[];
                (.key|startswith("Shop")) and .value=="TRUE" );
     with_entries( when( .key|startswith("Shop");
                         .value |= toboolean) ) ))

<>你的总体要求不清楚,但是如果你真的想按照你建议的方式更新任意JSON文本,你可能想考虑使用<代码> Wave。不过,为了简单起见,我假设您只是拥有一个显示的对象数组

让我们从将真/假更改为真/假的简单任务开始。这可以通过以下方式直接实现:

map( map_values(if . == "TRUE" then true 
                elif . == "FALSE" then false
                else .
                end) )
但由于您的“至少一个“车间”设置为“真”要求,因此定义一个辅助功能将很有帮助:

 def toboolean:
   if . == "TRUE" then true 
   elif . == "FALSE" then false
   else .
   end;
因此,第一项任务可以通过以下方式完成:

map(map_values(toboolean))
现在我们可以走了。假设您的jq有
any/2
,根据您的总体需求的一种解释,我们可以写:

map( if any( to_entries[];
             (.key|startswith("Shop")) and .value=="TRUE" )
     then map_values(toboolean)
     else .
     end)
或者,如果仅更改“车间”值:

map( if any( to_entries[];
             (.key|startswith("Shop")) and .value=="TRUE" )
     then with_entries( if .key|startswith("Shop")
                        then .value |= toboolean
                        else .
                        end)
     else .
     end)

如果您的JQ没有<代码>任何/ 2 ,请考虑升级;如果这不是一个选项,您可以使用

reduce
编写自己的(低效)版本

使用when/2 可以使用通用函数
when/2
简化上述解决方案,该函数定义为:

def when(filter; action): if filter//null then action else . end;
例如,上面的八行解决方案变成了这四行,当/2
时,一旦熟悉了
,也可能更容易阅读:

map( when( any( to_entries[];
                (.key|startswith("Shop")) and .value=="TRUE" );
     with_entries( when( .key|startswith("Shop");
                         .value |= toboolean) ) ))

我不知道什么是
jq
,但是为什么不把它们都放到Java布尔对象中进行转换呢?你说你想要
true
,但是你的例子有
“true”
。这是哪一个?@OrangeDog您是对的,在OPI中更改了不知道
jq
是什么,但为什么不将它们全部推到Java布尔对象中进行转换呢?您说您想要
true
,但您的示例具有
“true”
。这是哪一个?@OrangeDog你说得对,在操作系统中发生了变化,这太棒了;你能再解释一下map函数吗?
map/1
在jq本身中定义为:
defmap(f):[[]|f]。有关更多详细信息,请参阅jq手册和/或谷歌:地图功能编程这是非常好的;你能再解释一下map函数吗?
map/1
在jq本身中定义为:
defmap(f):[[]|f]。有关更多详细信息,请参阅jq手册和/或google:map函数编程