希望将名称的所有值更改为小写。
我目前正在运行
map( .[].data_node.name |= ascii_downcase)
并收到jq: error (at data3.json:538): explode input must be a string
错误。
示例输入:
[
{
"data_node":{
"name":"FRODO BAGGINS",
"race":"hobbit",
"existence":"middle earth"
},
"parent":"bilbo baggins"
},
{
"data_node":{
"name":"SAMWISE GAMJEE",
"race":"hobbit",
"existence":"middle earth"
},
"parent":"gamjee lord"
},
{
"data_node":{
"name":null,
"race":"hobbit",
"existence":"middle earth"
},
"parent":"bilbo baggins"
}
]
示例输出:
[
{
"data_node":{
"name":"frodo baggins",
"race":"hobbit",
"existence":"middle earth"
},
"parent":"bilbo baggins"
},
{
"data_node":{
"name":"samwise gamjee",
"race":"hobbit",
"existence":"middle earth"
},
"parent":"gamjee lord"
},
{
"data_node":{
"name": null,
"race":"hobbit",
"existence":"middle earth"
},
"parent":"bilbo baggins"
}
]
我当前的代码行出了什么问题,正确执行此操作的解决方案是什么。
更简短、更健壮:
map(.data_node.name |= if type == "string" then ascii_downcase else . end)
或者更简短地说:
map(.data_node.name |= ascii_downcase? // .)
(这些假设在没有 -s 选项的情况下调用 jq。
添加一个if
条件,仅当name
字段未null
为时才进行大小写转换
map( if (.data_node.name != null) then .data_node.name |= ascii_downcase else . end )
就您看到的错误而言,我假设我们应用的大小写转换不适用于jq
中的null
数据类型,仅适用于字符串类型。
直接在命令行上运行它而不作为脚本运行
jq 'map( if (.data_node.name != null) then .data_node.name |= ascii_downcase else . end )' < data3.json
jqplay-URL