2016-02-02 22 views
21

Tôi đang cố gắng để có được jq để phân tích cấu trúc JSON như:Sử dụng JQ để phân tích một JSON Chuỗi

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

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

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

Nhưng đó bị treo 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 JSON hơn. Làm cách nào để nhận được 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 đó là 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 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ần thiết.

+0

Câu hỏi này cũng giúp ích nếu bạn đang tìm kiếm: "Làm cách nào để bỏ chuỗi json không sử dụng jq?" – k0pernikus

Trả lời

27

JQ có fromjson dựng sẵn cho việc này:

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

fromjson đã được bổ sung trong 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ì nó có nhiều 'thành ngữ' tôi cảm thấy hơn. Chúc mừng. –

+2

Điều này phải được đánh dấu là câu trả lời đúng. –

+0

@ColinGrogan làm ơn. – vbence

18

Bạn có thể sử dụng kết quả thô (-r) sẽ hủy thoát nhân vật:

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

PHỤ LỤC: Đây có ưu điểm là nó hoạt động trong JQ 1.3 và lên; thực sự, nó sẽ hoạt động trong mọi phiên bản của jq có tùy chọn -r.

+0

Tuyệt vời, cảm ơn! –

Các vấn đề liên quan