使用jq进行大小写转换时出现错误“爆炸输入必须是字符串”

时间:2018-06-20 08:00:58

标签: json jq

试图将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"
   }
]

我当前的代码行有什么问题,正确的解决方案是什么?

2 个答案:

答案 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

jqplay-URL

答案 1 :(得分:1)

更简短,更强大:

map(.data_node.name |= if type == "string" then ascii_downcase else . end)

或更简单地说:

map(.data_node.name |= ascii_downcase? // .)

(这些假设不带-s选项调用jq。)