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

sam*_*sam 11 jq

{
    "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"
                }
                ]
            }
        ]
}
]
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,但收到错误

无法用字符串“标题”索引数组

jq -r '.content[]|[.Title,.brand,.characteristics,.value]' $jsonfile.
Run Code Online (Sandbox Code Playgroud)

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

我该如何解决这个问题?

预期输出:

abc,xyz,90,Normal.
abc,xyz,100,high.
abc,xyz,80,low
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 14

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

[
  "abc",
  "xyz",
  null,
  null
]
Run Code Online (Sandbox Code Playgroud)

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

该命令将会给你的消息是:

jq -r '.[] | [.Title,.brand,.characteristics,.value]' "$jsonfile"
Run Code Online (Sandbox Code Playgroud)

或者

jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"
Run Code Online (Sandbox Code Playgroud)

缺少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"
Run Code Online (Sandbox Code Playgroud)

<object(s)> as <variable>就像在一个循环中jq,所以这里所发生的是,$t将被分配的每个元素.details.Temperature[]反过来,对于每个元素,一个新的数组构造。该数组将通过@csv它将输出 CSV 格式的行。

jq将始终双引号其 CSV 输出的字段。去掉不必要的引号:

jq -r '...as above...' file.json | csvformat
Run Code Online (Sandbox Code Playgroud)

(csvformat是 的一部分csvkit)

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

  • Kusal 感谢您的投入。我在 for 循环中使用上面的东西。详情如下。用于温度认证领域;做 echo $field :: jq --arg field "$field" -r ' .content[] | .details."$field"[] as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json 完成。但是得到“jq:错误:在 &lt;top-level&gt;,第 1 行,对于异常命名的字段,尝试 .["field"] 而不是 .field:” (2认同)