使用JQ 1.4将复杂的JSON(包含数组和不同的数据类型)转换为CSV

时间:2016-09-05 16:47:30

标签: json export-to-csv jq

我有以下JSON数据:

   {
        "status": "ok",
        "ok": true,
        "data": "MFR-L",
        "stores": [{
            "name": "KOLL",
            "lat": 52.93128,
            "lng": 6.962956,
            "dist": 1,
            "x10": 1.129,
            "isOpen": true
        },
        {
            "name": "Takst",
            "lat": 52.9523773,
            "lng": 6.981644,
            "dist": 1.3,
            "x10": 1.809,
            "isOpen": false
        }]
    }

我试图使用JQ将其转换为平面文件,但我一直遇到各种各样的问题,特别是因为文件类型("无法使用字符串&#34索引布尔值;等等)。

到目前为止,

This post帮助我压缩了数组的内容,如下所示:

jq -r -s 'map(.stores | map({nm: .name, lt: .lat} | [.nm, .lt])) | add [] | @csv

如何让层次结构中的内容更高,以映射到数组内容?

3 个答案:

答案 0 :(得分:5)

您总是可以从子对象中分别从父对象中收集所需的值,并在以后合并它们。

如,

$ jq -r '[.data] + (.stores[] | [.name, .lat, .lng, .dist]) | @csv' input.json

产量

"MFR-L","KOLL",52.93128,6.962956,1
"MFR-L","Takst",52.9523773,6.981644,1.3

答案 1 :(得分:0)

有几种方式可以将说明性JSON“展平”(例如,对于CSV),但以下两种方法可能是有意义的。 (为了便于阅读,我省略了@csv的调用。) $ jq '[.data, .stores[][]]' in.json [ "MFR-L", "KOLL", 52.93128, 6.962956, 1, 1.129, true, "Takst", 52.9523773, 6.981644, 1.3, 1.809, false ]

$ jq '.data as $data | .stores[] | [$data, .[]]' in.json [ "MFR-L", "KOLL", 52.93128, 6.962956, 1, 1.129, true ] [ "MFR-L", "Takst", 52.9523773, 6.981644, 1.3, 1.809, false ]

答案 2 :(得分:0)

这是另一种使用jq变量和字符串插值的方法:

   .data as $data
 | .stores[]
 | "\($data),\(.name),\(.lat),\(.lng),\(.dist),\(.x10),\(.isOpen)"

输出样本数据:

"MFR-L,KOLL,52.93128,6.962956,1,1.129,true"
"MFR-L,Takst,52.9523773,6.981644,1.3,1.809,false"