Sử dụng jq để phân tích cú pháp chuỗi JSON


87

Tôi đang cố gắng jqphân tích cú pháp cấu trúc JSON như:

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

Đó là, một phần tử trong JSON là một chuỗi có json thoát.

Vì vậy, tôi có một cái gì đó dọc theo dòng $ jq [.c] myFile.json | jq [.id]

Nhưng điều đó xảy ra với jq: error: Cannot index string with string

Điều này là do đầu ra của .c là một chuỗi, không phải JSON nhiều hơn. Làm cách nào để lấy jq để phân tích cú pháp chuỗi này?

Giải pháp ban đầu của tôi là để sử dụng sed để thay thế tất cả các ký tự thoát ( \":\", \",\"\") nhưng điều đó lộn xộn, tôi giả sử có một cách xây dựng vào jqđể làm điều này?

Cảm ơn!

chỉnh sửa: Ngoài ra, phiên bản jq có sẵn ở đây là:

$ jq --version
jq version 1.3

Tôi đoán tôi có thể cập nhật nó nếu được yêu cầu.


Câu hỏi này cũng hữu ích nếu bạn đang tìm kiếm: "Làm thế nào để unescape chuỗi json bằng cách sử dụng jq?"
k0pernikus

Câu trả lời:


165

jq có fromjsonnội trang cho điều này:

jq '.c | fromjson | .id' myFile.json

fromjson đã được thêm vào phiên bản 1.4.


2
Cảm ơn bạn. Những công việc này. Tôi sẽ chấp nhận câu trả lời này, vì tôi cảm thấy nó 'thành ngữ' hơn. Chúc mừng.
Colin Grogan

@ColinGrogan làm ơn làm đi.
vbence

@ColinGrogan: Tôi không thấy có lý do gì để thay đổi câu trả lời được chấp nhận vì bạn đã viết rõ ràng trong câu hỏi của mình rằng bạn đã sử dụng phiên bản 1.3 của jq trong đó fromjsonkhông có tính năng này. Nói cách khác, ngay cả khi câu trả lời này thú vị, nó không trả lời câu hỏi.
Casimir et Hippolyte

Có thể sử dụng điều này nhưng trên toàn bộ tệp json (không chỉ định thuộc tính .id) không?
Florian Castelain

1
@FlorianCastelain có, hoặc bỏ qua nó hoặc sử dụng dấu chấm: jq 'fromjson | .' myfile, nơi myfile chứa"{\"key\":1, \"word\":\"cat\"}"

41

Bạn có thể sử dụng đầu ra thô (-r) sẽ loại bỏ các ký tự:

jq -r .c myfile.json | jq .id

ADDENDUM: Cái này có ưu điểm là nó hoạt động ở jq 1.3 trở lên; thực sự, nó sẽ hoạt động trong mọi phiên bản jq có tùy chọn -r.

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.