使用jq将json数据格式化为csv数据

use jq to format json data into csv data

{
    "Users": [
        {
            "Attributes": [
                {
                    "Name": "sub",
                    "Value": "1"
                },
                {
                    "Name": "phone_number",
                    "Value": "1234"
                },
                {
                    "Name": "referral_code",
                    "Value": "abc"
                }
            ]
        },
        {
            "Attributes": [
                {
                    "Name": "sub",
                    "Value": "2"
                },
                {
                    "Name": "phone_number",
                    "Value": "5678"
                },
                {
                    "Name": "referral_code",
                    "Value": "def"
                }
            ]
        }
    ]
}

如何生成如下所示的输出?

1,1234,abc

2,5678,def

jq '.Users[] .Attributes[] .Value' test.json

produces


1
1234
abc
2
5678
def

不确定这是处理此问题的最干净的方法,但以下将获得所需的输出:

.Users[].Attributes | map(.Value) | @csv
  1. 遍历所有深层属性.Users[].Attributes
  2. map() 获取所有 Value
  3. 转换为@csv

jqPlay demo

如果您不需要保证输出为 CSV,并且您确定“名称”值以相同的顺序显示,您可以选择:

.Users[].Attributes
| from_entries
| [.[]]
| join(",")

为了安全起见,最好确保排序的一致性:

(.Users[0] | [.Attributes[] | .Name]) as $keys
| .Users[]
| .Attributes
| from_entries
| [.[ $keys[] ]]
| join(",")

使用 join(",") 将生成 Q 中所示的逗号分隔值(不带引号),但保证 不会生成预期的 CSV输入的所有有效值。如果您不介意讨厌的引号,可以使用 @csv,或者如果您想跳过所有数值周围的引号:

map(tonumber? // .) | @csv