过滤对象或数组

时间:2019-09-01 19:21:58

标签: json jq

我想列出给定json中的所有ID和角色,但其中只有一个角色,而不是1的数组,它提供了它作为对象,因此如果我运行“ []?”我收到错误“无法为字符串“名称”索引字符串”。

提取(example.json):

{
  "Person": [
    {
      "Roles": {
        "Role": {
          "@Id": "1",
          "Name": "Job1"
        }
      }
    },
    {
      "Roles": {
        "Role": [
          {
            "@Id": "2",
            "Name": "Job2"
          },
          {
            "@Id": "3",
            "Name": "Job3"
          }
        ]
      }
    }
  ]
}

我希望这可能起作用:

jq -r . | '.Roles.Role[]?>.@Id + "," + .Roles.Role[]?>.Name'

这是我想要的输出(以便可以通过管道传输到csv)

1,Job1
2,Job2
3,Job3

2 个答案:

答案 0 :(得分:0)

以下将产生如下所示的CSV。调整程序以删除双引号等很容易。

.Person[]
| .Roles.Role
| if type == "array" then .[] else . end
| [.["@Id"], .Name]
| @csv

输出

"1","Job1"
"2","Job2"
"3","Job3"

在.Person中添加索引

.Person
| range(0; length) as $ix
| .[$ix]
| .Roles.Role
| if type == "array" then .[] else . end
| [$ix, .["@Id"], .Name]
| @csv

答案 1 :(得分:0)

或者,您可以使用path-based Unix实用程序 jtc 来达到相同的效果,这里是jtc的样子:

bash $ <example.json jtc -w'[@Id]:<id>P:[-1][Name]' -T'"{id},{}"' -qq
1,Job1
2,Job2
3,Job3
bash $ 

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者