Thông báo lỗi Không thể mảng chỉ mục với chuỗi 'Tiêu đề' khi phân tích dữ liệu JSON bằng jq


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"
                }
                ]
            }
        ]
}
]
}

Tôi đã thử cách tiếp cận dưới đây, nhưng nhận được lỗi

Không thể chỉ mục mảng với chuỗi "Tiêu đề"

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

Tôi đã thử trên cùng một dòng với các phần khác, nhưng nhận được cùng một lỗi.

Làm thế nào để tôi giải quyết vấn đề này?

Sản lượng dự kiến:

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

Câu trả lời:


12

Bạn không nhận được Cannot index array with string "Title"lệnh đó, bạn đang nhận được

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

vì không có characteristicshoặc valuekhóa trong các đối tượng của contentsmảng (chúng là các khóa trong .details.Temperaturemảng phụ).

Lệnh sẽ cho bạn thông báo đó là:

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

hoặc là

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

Thiếu contenttra cứu khóa hoặc không nhận được các phần tử của contentmảng, mang lại một mảng của một đối tượng chứ không phải chính đối tượng đó. Và bạn không thể lập chỉ mục một mảng với một chuỗi.


Giả sử bạn muốn đầu ra 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"

Các <object(s)> as <variable>hành động giống như một vòng lặp jq, vì vậy những gì xảy ra ở đây $tsẽ được chỉ định .details.Temperature[]lần lượt từng phần tử và cho mỗi phần tử, một mảng mới được xây dựng. Mảng được truyền qua @csvsẽ xuất ra các hàng có định dạng CSV.

jqsẽ luôn trích dẫn gấp đôi các trường của đầu ra CSV của nó. Để thoát khỏi những trích dẫn không cần thiết :

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

( csvformatlà một phần của csvkit)

Hoặc, bạn có thể muốn sử dụng @tsvthay thế @csvđể có đầu ra được phân định bằng tab thay thế.


2
Kusal Cảm ơn bạn cho đầu vào của bạn. Tôi đang sử dụng điều trên với vòng lặp cho. chi tiết bên dưới. cho lĩnh vực chứng nhận nhiệt độ; làm echo $ field :: jq --arg trường "$ field" -r '.content [] | .details. "$ field" [] là $ t | [.Title, .brand, $ t.value, $ t.characteristic] | @csv 'file.json đã xong. nhưng nhận được "jq: error: try. [" field "] thay vì .field cho các trường được đặt tên bất thường ở <top-level>, dòng 1:"
sam

Tôi đã nhận được điều này, tôi không thể tương quan và đang đặt .details. $ [Field] hoặc .details. "$ Field". Bây giờ tôi đã thay đổi nó thành .details [$ field] [] và giờ nó hoạt động tốt.
sam

1
@sam Xin lỗi, tôi đã ở nơi khác. Có, .details[$field][]hoặc .["details"][$field][]là cú pháp chính xác.
Kusalananda

Tôi đã bình chọn và cảm ơn bạn đã ủng hộ.
sam

Kusal, xin lỗi vì đã làm phiền bạn một lần nữa. Có thể lấy các giá trị chính của nội dung mà không cần đặt tên của các trường. Các giá trị "Tiêu đề", "thương hiệu", "kích thước", "ngày". một cái gì đó như jq -r .content [] | và nó cho tôi tất cả các giá trị chính như đã đề cập ở trên.
sam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.