csv jq:error(at file.json:xy):无法用字符串“string”索引字符串/数组

ulydmbyx  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(195)

***我有一个json文件,其中包含1个数组,包含上千个文档。***我需要将文件转换为csv格式,只需要指定值即可。

每个文档可以有另一个字段或子文档的组合,或者(这就是我的问题),有时字段的值是子文档的数组,在其他情况下,它的值只是subcdoc或字段不存在。
我的目标是提取**. meta.dev.devId**的值(如果字段不存在,则在csv中使用空列。例如,在基本数组中的文档:

1st doc:
{ 
    "docId": "some_hex", 
    "bin": { 
        "field": "value", 
        "length": "123456"
    },
    "item": "item",
    "meta": { 
        "date": "dateFnc(123456789)",
        "name": "name",
        "dev": {
            "devId": "987654321",
            "devName": "name"
        },
    "type": "type1" 
    }
}
2nd doc:
{ 
    "docId": "some_hex", 
    "bin": { 
        "field": "value", 
        "length": "123456"
    },
    "item": "item",
    "meta": { 
        "date": "dateFnc(123456789)",
        "name": "name",
        "dev": [ {
            "devId": "987654321",
            "devName": "name"
        } ],
    "type": "type1" 
    }
}
3rd doc:
{ 
    "docId": "some_hex", 
    "bin": { 
        "field": "value", 
        "length": "123456"
    },
    "item": "item",
    "meta": { 
        "date": "dateFnc(123456789)",
        "name": "name",
    "type": "type1" 
    }
}

***命令1:**jq -r '.[] | [.docId, .item, .meta.date, .meta.name, .meta.dev[]?.devId] | @csv' file.json > file.csv
结果1:**无法索引字符串为devId的字符串 *
***命令2:
jq -r '.[] | [.docId, .item, .meta.date, .meta.name, .meta.dev[].devId] | @csv' file.json > file.csv
***结果2:***无法迭代null(null)
***命令3:
jq -r '.[] | [.docId, .item, .meta.date, .meta.name, .meta.dev.devId] | @csv' file.json > file.csv
***结果3:****无法索引字符串为devId的数组 *

如何理解命令:
.[]|[. meta.dev.devId] →预期值:“串”
.[]|[.meta.dev[].devId] →预期值:[数组]
.[]|[.meta.dev[]?.devId] →预期值:[array]或不是数组

bvjxkvbb

bvjxkvbb1#

您可以遍历到.meta.dev,然后使用快捷键objectsarrays按类型进行过滤,并结合特定于类型的操作(例如:用arrays[0].devId提取第一个数组项的字段)。如果.meta.dev不存在,它将产生null,因此您可以使用相同的技术来提供默认值(例如nulls | "missing")。

< file.json > file.csv jq -r '.[] | [
  .docId, .item, .meta.date, .meta.name,
  (.meta.dev | objects.devId, arrays[0].devId, (nulls | "missing"))
] | @csv'

Demo
或者,您可以使用解构替代运算符?//来提供不同的预期结构([{$devId}]{$devId}):

< file.json > file.csv jq -r '.[] | [
  .docId, .item, .meta.date, .meta.name,
  (.meta.dev as [{$devId}] ?// {$devId} | $devId) // "missing"
] | @csv'

Demo
file.csv的内容:

"some_hex","item","dateFnc(123456789)","name","987654321"
"some_hex","item","dateFnc(123456789)","name","987654321"
"some_hex","item","dateFnc(123456789)","name","missing"
0ve6wy6x

0ve6wy6x2#

dev是一个数组时,可以在type上使用if-then-else-endmap() over devId,或者如果不是,则只使用.devId

.[] | [ .meta?.dev? | if type == "array" then map(.devId)[] else .devId? end ] | @csv

使用3个输入文档生成数组:

"\"987654321\""
"\"987654321\""
""
JqPlay Demo

相关问题