使用 jq 解析 JSON 数据时出现错误消息“Cannot index array with string 'Title'”

使用 jq 解析 JSON 数据时出现错误消息“Cannot index array with string 'Title'”
{
    "content": [
    {
        "Title": "abc",
        "brand": "xyz",
        "size": "5 g",
        "date": "2019-01-01",
        "details": {
            "Temperature": [
            {
                "value": "90",
                "characteristics":"Normal"
            },
            {
                "value":"100",
                "characteristics":"high"
            },

            {
                "value":"80",
                "characteristics":"low"
            }
            ],

            "certifications": [
            {
                "value": "based",
                "characteristics":"pass"
            },

            {
                "value": "50",
                "characteristics":"failed"
            }
            ]
        },

         "formats": {
            "city": "NYC",
            "id": "007",
            "manufacture":""
            },
        "innerDetails": [
        {
            "contains": "abc",
            "panel":"xyz",
            "values":[
                {
                    "name":"abc",
                    "value":"10"
                },
                {
                    "name":"xyz",
                    "value":"20"
                }
                ]
            }
        ]
}
]
}

我尝试过以下方法,但出现错误

无法使用字符串“Title”索引数组

jq -r '.content[]|[.Title,.brand,.characteristics,.value]' $jsonfile.

我尝试与其他部分在同一行上进行操作,但遇到了相同的错误。

我该如何解决这个问题?

预期输出:

abc,xyz,90,Normal.
abc,xyz,100,high.
abc,xyz,80,low

答案1

你没有得到Cannot index array with string "Title"这个命令,你得到了

[
  "abc",
  "xyz",
  null,
  null
]

因为数组的对象中没有characteristics或键(它们是子数组中的键)。valuecontents.details.Temperature

该命令给你的信息是:

jq -r '.[] | [.Title,.brand,.characteristics,.value]' "$jsonfile"

或者

jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"

错过content键查找,或者无法获取数组的元素content,会产生一个包含一个对象的数组,而不是对象本身。而且你不能用字符串索引数组。


假设您想要 CSV 输出:

$ jq -r '.content[] | .details.Temperature[] as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
"abc","xyz","90","Normal"
"abc","xyz","100","high"
"abc","xyz","80","low"

<object(s)> as <variable>行为类似于 中的循环jq,因此这里发生的情况是$t依次分配 的每个元素.details.Temperature[],并为每个元素构造一个新数组。传递的数组@csv将输出 CSV 格式的行。

jq将始终双引号其 CSV 输出的字段。为了摆脱不必要引号:

jq -r '...as above...' file.json | csvformat

csvformat是其一部分csvkit

或者,您可能希望使用@tsvin 代替来@csv获取制表符分隔的输出。

相关内容