使用jq解析JSON数据时出现错误消息“无法使用字符串'标题'索引数组”


9
{
    "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

Answers:


12

您没有Cannot index array with string "Title"使用该命令,而是

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

因为数组对象中没有键characteristicsvaluecontents(它们是.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

或者,您可能想@tsv代替使用@csv获得制表符分隔的输出。


2
库萨尔感谢您的投入。我正在上面的东西与for循环。详细信息如下。用于现场温度认证; 做echo $ field :: jq --arg field“ $ field” -r'.content [] | .details。“ $ field” [] as $ t | [.Title,.brand,$ t.value,$ t.characteristics] | @csv'file.json完成。但是得到“ jq:错误:在<top-level>,第1行中,对于不寻常命名的字段,尝试用。[“ field”]而不是.field”
sam

我明白了这一点,我无法建立关联,而是将.details。$ [field]或.details。“ $ field”放入。现在,我将其更改为.details [$ field] [],现在可以正常使用了。
山姆

1
@sam对不起,我在其他地方。是的,.details[$field][]或者.["details"][$field][]是正确的语法。
库萨兰达

我已投票赞成,感谢您的支持。
山姆

库萨尔,抱歉再次打扰您。是否可以在不提供字段名称的情况下获取内容主值。“标题”,“品牌”,“大小”,“日期”值。类似jq -r .content [] | 如上所述,它给了我所有的主要价值。
山姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.