2016-08-01 16 views
7

Giả sử tôi có JSON sau, được lưu trữ trong biến của tôi jsonVariable.jq - Làm cách nào để in giá trị gốc của đối tượng khi tôi đã thâm nhập sâu vào con của đối tượng?

{ 
    "id": 1, 
    "details": { 
     "username": "jamesbrown", 
     "name": "James Brown", 
    } 

} 

tôi phân tích JSON này với JQ sử dụng như sau:

echo $jsonVariable | jq '.details.name | select(.name == "James Brown")' 

này sẽ cho tôi kết quả

James Brown

Nhưng nếu tôi muốn nhận được id của người này là tốt? Bây giờ, tôi biết đây là một ví dụ đơn giản và thô lỗ - chương trình mà tôi đang làm việc với thời điểm này là 5 hoặc 6 cấp độ sâu với nhiều hàm JQ khác nhau hơn là chọn. Tôi cần một cách để chọn trường của cha mẹ khi tôi đã có 5 hoặc 6 lớp sâu sau khi thực hiện các phương pháp lọc khác nhau.

Có ai giúp được không? Có cách nào để 'đảo ngược', sao lưu cho phụ huynh không? (Không chắc chắn nếu tôi làm cho ý nghĩa!)

+0

có vẻ như bạn muốn '.id | chọn (.name == "James Brown") 'Bạn đã thử điều đó chưa? – mrtig

+0

Ah xin lỗi, không giải thích chính xác. Tôi muốn có cả hai – Xenidious

Trả lời

15

Đối với một cách tiếp cận chung chung hơn, tiết kiệm giá trị của phần tử "cha mẹ" ở cấp độ chi tiết mà bạn muốn, sau đó ống nó ở phần cuối của bộ lọc của bạn:

jq '. as $parent | .details.name | select(. == "James Brown") | $parent'

Dĩ nhiên , đối với trường hợp tầm thường bạn phơi bày, bạn có thể bỏ qua điều này hoàn toàn:

jq 'select(.details.name == "James Brown")'

Ngoài ra, xem xét rằng nếu bạn chọn các bộ lọc trả về nhiều kết quả phù hợp cho một đối tượng cha, bạn sẽ nhận được một bản sao của đối tượng cha cho mỗi đối sánh. Bạn có thể muốn đảm bảo rằng các bộ lọc chọn chỉ trả về một phần tử ở cấp độ gốc bằng cách gói tất cả các kết quả phù hợp dưới cấp độ cha thành một mảng hoặc để loại bỏ kết quả cuối cùng với unique.

+0

Đây chính xác là những gì tôi cần. Cảm ơn! – Xenidious

0

này cung cấp cho một shot:

echo $jsonVariable | jq '{Name: .details.name, Id: .Id} | select(.name == "James Brown")' 
0

Thay vì truy vấn lên đến giá trị mà bạn đang thử nghiệm cho, truy vấn đến các đối tượng gốc có chứa các giá trị bạn đang truy vấn và các giá trị bạn muốn chọn.

Bạn cần đối tượng có chứa cả số idname.

$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json 
Các vấn đề liên quan