2013-09-03 20 views
93

Tôi có file json sau:Chọn đối tượng dựa trên giá trị của biến trong đối tượng sử dụng JQ

{ 
    "FOO": { 
     "name": "Donald", 
     "location": "Stockholm" 
    }, 
    "BAR": { 
     "name": "Walt", 
     "location": "Stockholm" 
    }, 
    "BAZ": { 
     "name": "Jack", 
     "location": "Whereever" 
    } 
} 

Tôi đang sử dụng JQ và muốn để có được những "tên" yếu tố của các đối tượng nơi 'vị trí' là ' Stockholm '.

Tôi biết tôi có thể nhận được tất cả các tên bởi

cat json | jq .[] | jq ."name" 
"Jack" 
"Walt" 
"Donald" 

Nhưng tôi không thể tìm ra cách để in đối tượng nhất định, do giá trị của một chìa khóa phụ (ở đây "location" : "Stockholm").

+8

FYI, tôi hỏi để loại bỏ các 'JQ -> jQuery' từ đồng nghĩa: http://meta.stackexchange.com/q/ 195697/142802. –

+0

Cảm ơn, tôi đã thăng hoa :) – Daniel

Trả lời

139

Sau nhiều googling tìm chủ yếu jQuery thứ, tôi thấy một bài viết trên blog với câu trả lời:

$ jq '.[] | select(.location=="Stockholm")' json 
{ 
    "location": "Stockholm", 
    "name": "Walt" 
} 
{ 
    "location": "Stockholm", 
    "name": "Donald" 
} 

Từ đây: http://zerokspot.com/weblog/2013/07/18/processing-json-with-jq/

+8

Làm cách nào để nhận được 'FOO' của cha mẹ, 'BAR', 'BAZ'? – spazm

72

Để có được một dòng chỉ tên:

$ jq '.[] | select(.location=="Stockholm") | .name' json 

sản xuất:

"Donald" 
"Walt" 

Để có được một dòng tương ứng (tên chủ chốt, "tên" thuộc tính) cặp, xem xét:

$ jq -c 'to_entries[] 
     | select (.value.location == "Stockholm") 
     | [.key, .value.name]' json 

Output:

["FOO","Donald"] 
["BAR","Walt"] 
+5

Tôi không chắc làm thế nào câu trả lời khác đã đi trước này. – akhan

+0

Ông muốn toàn bộ đối tượng dựa trên vị trí: "Tôi không thể tìm ra cách in chỉ một số đối tượng, với giá trị của khóa phụ" –

+0

Đây là thiên tài thuần túy @peak – look

14

Tôi đã có một câu hỏi tương tự liên quan: Điều gì nếu bạn muốn bản gốc định dạng đối tượng trở lại (với các tên khóa, ví dụ FOO, BAR)?

Jq cung cấp to_entriesfrom_entries để chuyển đổi giữa các đối tượng và mảng cặp khóa-giá trị. Điều đó cùng với map xung quanh lựa chọn

Các chức năng này chuyển đổi giữa một đối tượng và một dãy khóa-giá trị cặp. Nếu to_entries được truyền một đối tượng, thì đối với mỗi mục nhập k: v trong đầu vào, mảng đầu ra bao gồm {"key": k, "value": v}.

from_entries thực hiện chuyển đổi ngược lại và with_entries (foo) là viết tắt cho to_entries | bản đồ (foo) | from_entries, hữu ích khi thực hiện một số thao tác với tất cả các khóa và giá trị của một đối tượng. from_entries chấp nhận khóa, Khóa, tên, Tên, giá trị và Giá trị làm khóa.

jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries' 

{ 
    "FOO": { 
    "name": "Donald", 
    "location": "Stockholm" 
    }, 
    "BAR": { 
    "name": "Walt", 
    "location": "Stockholm" 
    } 
} 

Sử dụng with_entries viết tắt, điều này trở thành:

jq15 < json 'with_entries(select(.value.location=="Stockholm"))' 
{ 
    "FOO": { 
    "name": "Donald", 
    "location": "Stockholm" 
    }, 
    "BAR": { 
    "name": "Walt", 
    "location": "Stockholm" 
    } 
}