给定这个json:

{"data": [
  {
    "account_id": "123",
    "account_status": "active",
    "name": "john doe",
    "email": "johndoe@anywhere.com",
    "product_access": []
  },
  {
    "account_id": "345",
    "account_status": "active",
    "name": "jane doe",
    "email": "janedoe@anywhere.com",
    "last_active": "2023-08-23T13:03:27.811473590Z",
    "product_access": [
      {
        "name": "Product 1",
        "key": "product1",
        "url": "acme1.com"
      },
      {
        "name": "Product 1",
        "key": "product1",
        "url": "acme2.com"
      },
      {
        "name": "Product 1",
        "key": "product1",
        "url": "acme3.com"
      },
      {
        "name": "Product 2",
        "key": "product2",
        "url": "acme4.com",
        "last_active": "2023-08-23T13:03:27.811473590Z"
      },
      {
        "name": "Product 3",
        "key": "product3",
        "url": "acme5.com"
      },
      {
        "name": "Product 1",
        "key": "product1",
        "url": "acme4.com",
        "last_active": "2023-08-17T18:21:52.472085713Z"
      }
    ]
  }
]
}

我正在try 编写一个JQ表达式,以使CSV文件中的输出如下所示(为简单起见,此处不添加转义字符):

"account_id", "account_status", "name", "email", "Product 1", "Product 2", "Product 3"
"123", "active", "john doe", "johndoe@anywhere.com", ",,"
"345", "active", "jane doe", "janedoe@anywhere.com", "acme1.com, acme2.com, acme3.com, acme4.com", "acme4.com", "acme5.com"

到目前为止我已经试过了...

jq -r '["account_id", "account_status", "name", "email", "product 1", "product 2", "product 3"],
        (.data[] | [.account_id, .account_status, .name, .email,
                    (.product_access[] | select(.key == "product1").url // ""),
                    (.product_access[] | select(.key == "product2").url // ""),
                    (.product_access[] | select(.key == "product3").url // "")] | join(",")) | @csv'

它不会将产品n URL整理到单个单元格中.

推荐答案

试试这个:

jq -r '
["account_id", "account_status", "name", "email", "product 1", "product 2", "product 3"],
(.data[]
 | [.account_id, .account_status, .name, .email,
    ("product1","product2","product3") as $prod
    | [(.product_access[] | select(.key == $prod).url)] | join(",")
   ]
)
| @csv' input.json

Json相关问答推荐

使用Jolt变换转换JsonArray以将关键字转移到内部JsonArray中

如何在JQ过滤器文件中使用多行?

使用Jolt v.0.1.1向每个json元素添加一个键-值对

如何在Haskell中解析JSON,其中字段的名称可以是多个值之一,但应该转换为单个Haskell类型?

无法从MongoDB集合中检索正确的文档

如何将响应数据保存到Flutter 中的共享首选项中

如何使用PowerShell从ExchangeOnline命令执行中获得JSON输出

如何使用jq使用子值对象的键对json对象进行分组

在这种情况下我如何实现 UnmarshalJSON 并且只为一个接口字段定义特殊行为?

jq 中的整个单词匹配

数据清理设计不良的 JSON 数据 - 需要有关最佳策略的建议

无法使用 vue.js 访问 JSON 数组的项目

Go - JSON 验证抛出错误,除非我在 struct 中使用指针.为什么?

如何使用 jq 返回此 JSON 文件的文本字段?

当值包含ansible中的字符串时解析json值

序列化为json时如何忽略空列表?

如何在 Go 中生成带有排序键的 JSON?

Spring restTemplate 获取原始 json 字符串

如何对 jq 中的 map 数组中的值求和?

XML vs YAML vs JSON