在使用 jq 进行大小写转换时出错'explode input must be a string'



希望将名称的所有值更改为小写。

我目前正在运行

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

最新更新