替换所有的“;“真的”;及;假;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函数编程