2016-03-09 16 views
6

Vì vậy, tôi có một blob JSON như sau:Sử dụng jq để trích xuất các giá trị trong mảng JSON bằng một khóa boolean == true cụ thể?

[ 
    { 
    'id': 'something', 
    'isSparse': true 
    }, 
    ... 
] 

Làm thế nào để viết một lệnh jq mà sẽ lọc ra JSON blob này và in tôi ID của tất cả các mục trong mảng có isSparse == thật?

tôi thử như sau:

cat <blob> | jq -c '.[] | select(.operational | contains("true"))'

nhưng có được những điều sau đây, bởi vì rõ ràng true là một boolean và không phải là một chuỗi:

jq: error: boolean and string cannot have their containment checked.

Trả lời

2

Tôi giả sử bạn có nghĩa là isSparse. Bộ lọc select có thứ gì đó đánh giá thành giá trị boolean. isSparse đã là một boolean, do đó bạn chỉ cần chọn nó. contains được sử dụng để kiểm tra xem có cái gì đó trong một container (một chuỗi, mảng, đối tượng, vv).

$ jq -c '.[] | select(.isSparse)' <blob> 
8

Nếu nhiệm vụ là để "in ID của tất cả các mục trong mảng có isSparse == true", một bộ lọc JQ thích hợp sẽ là:

.[] | select(.isSparse == true) | .id 

Nếu có bất kỳ khả năng lặp lại giá trị .id, sau đó những điều sau đây có thể được sử dụng để đảm bảo chỉ có giá trị riêng biệt được phát ra:

map(select(.isSparse == true) | .id) | unique[] 

Như @JeffMercado chỉ ra, nếu .isSparse là đúng boolean, sau đó chọn (.isSparse) sẽ đủ.

4

Tôi thêm câu trả lời này vì nó có thể hữu ích trong tương lai cho một kịch bản có liên quan. - Một ví dụ cụ thể về điều này sẽ truy cập vào API được viết kém, trả về cùng một cặp khóa/giá trị khác nhau tùy thuộc vào điểm cuối hoặc bộ lọc nào được sử dụng. Điều này là rất khó chịu khi giao tiếp, và giá trị là một chuỗi đôi và một boolean vào những thời điểm khác (hơn nữa, đôi khi thậm chí một số, hoặc một số như là một chuỗi: |)


Thêm | tostring sẽ so sánh giá trị như mong muốn;

cat <blob> | jq -c '.[] | select(.isSparse | tostring | contains("true"))'

hoặc cho một kết hợp chính xác, biến thể nhẹ:

cat <blob> | jq -c '.[] | select((.isSparse | tostring) == "true")'

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