Jq --- 将嵌套的 json 转换为 csv

Jq --- 将嵌套的 json 转换为 csv

我有如下示例 JSON

{
  "data": [
    {
      "name": "city",
      "LIST": {
        "ID": [
          {
            "value": "ny",
            "name": "US"
          },
          {
            "value": "lon",
            "name": "GB"
          },
          {
            "value": "Toronto",
            "name": "CA"
          }
        ]
      }
    },
    {
      "name": "city1"
    }
  ]
}

我要获得如下值

city,ny

city1,

我只想要 name="US" 中的值jq

数组的每个元素的最大值为 1 name=“US” data。如果没有name=“US”,那么我希望它为空白或 NULL。在上面的示例中,如果第二条记录没有name=“US”,则输出将为city1,blankor city1,

答案1

假设每个data元素有最多.LIST.ID其数组中的一个元素name等于US

jq -r <file '.data[] |
  [ .name, (.LIST.ID[] | select(.name == "US").value)? // null ] |
  @csv'

它能做什么:

  1. 返回(保留)数组的所有元素data
  2. 对于 的每个元素data,创建一个两元素数组(CSV 格式化所需),其中包含:
    1. name每个data元素的属性值;
    2. 其equalsvalue的数组元素的属性值(如果有)(如果没有;您可以使用in 来在 CSV 输出中获取双引号字段来代替完全空的字段);括号表达式后的the确保即使或元素完全缺失也不会发生错误;.LIST.IDnameUSnull""null?.LIST.ID
  3. 将生成的数组列表呈现为 CSV 数据。

答案2

本质上是一样的弗拉桑的回答.LIST.ID,但是利用数组的元素可以转换为对象的事实,其中name值是键,value值是对应的值:

jq -r '.data[] | [.name, (.LIST.ID | from_entries? | .US) // "blank"] | @csv' file

使用给定的示例数据作为输入,这将生成以下无标头 CSV 数据:

"city","ny"
"city1","blank"

当数据中第二个字段不可用时,在表达式中更改// "blank"为以生成空字段。// nulljq

相关内容