使用包含特殊字符的jq访问字段,可以是对象或数组

时间:2018-03-22 11:29:42

标签: arrays object special-characters jq is-empty

我在file.json中有大量数据转储,如下所示:

[{
   "recordList" : {
      "record" : [{
          "Production" : {
              "creator.role" : {
                  "term" : "A"
              }
          }
      },
      {
          "Production" : {}
      },
      {
          "Production" : {
              "creator.role" : {
                  "term" : ""
              }
          }
      },
      {
          "Production" : [
              {
              "creator.role" : {"term" : "B"}
              },
              {
              "creator.role" : {"term" : ""}
              }
          ]
      }]
   }
}]

我需要检查记录中是否存在至少一个“termor.role”的'term'(非空)。如果有,我在CSV文件中为该字段提供1,否则为0。

感谢早期帖子的答案,我设法访问了字段“创建者”,尽管它可能是一个对象或一个数组(参见:Accessing field with jq that can be string or array)。

但是现在我对'creator.role'字段也有同样的问题,特殊字符'。'并且不知道如何处理。

我试过的代码:

jq -r '.[].recordList.record[].Production | "\(if ((type == "array" and .[0]["creator.role"].term and .[0]["creator.role"].term !="") or (type == "object" and ["creator.role"].term and ["creator.role"].term !="")) then 1 else 0 end),"' file.json

我收到此错误:

Cannot index array with string "term"

我想在这种情况下获得的输出是:

1,
0,
0,
1,

1 个答案:

答案 0 :(得分:0)

jq 解决方案:

jq -r '.[].recordList.record[].Production 
       | "\(if ((type == "array" and any(.["creator.role"].term !="")) 
            or (type == "object" and .["creator.role"].term and .["creator.role"].term !=""))
            then 1 else 0 end),"' file.json