试图将name的所有值更改为小写。
我当前正在运行
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"
}
]
我当前的代码行有什么问题,正确的解决方案是什么?
答案 0 :(得分:1)
如果if
字段不是name
,则添加null
条件以仅进行大小写转换
map( if (.data_node.name != null) then .data_node.name |= ascii_downcase else . end )
就您所看到的错误而言,我假设我们应用的大小写转换不适用于null
中的jq
数据类型,仅适用于字符串类型。
要直接在命令行上运行而不以脚本形式运行
jq 'map( if (.data_node.name != null) then .data_node.name |= ascii_downcase else . end )' < data3.json
答案 1 :(得分:1)
更简短,更强大:
map(.data_node.name |= if type == "string" then ascii_downcase else . end)
或更简单地说:
map(.data_node.name |= ascii_downcase? // .)
(这些假设不带-s选项调用jq。)