2015-01-27 12 views
77

Tôi có Json nàySử dụng JQ để phân tích và hiển thị nhiều lĩnh vực trong một json serially

{ 
    "users": [ 
     { 
      "first": "Stevie", 
      "last": "Wonder" 
     }, 
     { 
      "first": "Michael", 
      "last": "Jackson" 
     } 
    ] 
} 

Sử dụng JQ Tôi muốn hiển thị tên đầu tiên và cuối cùng nối tiếp. Như vậy -

Stevie Wonder 
Michael Jackson 

Đây là tôi đã nhận được bao xa -

jq '.users[].first, .users[].last' 

Nhưng nó sẽ hiển thị

"Stevie" 
"Michael" 
"Wonder" 
"Jackson" 

Thông báo sau -

  1. Các dấu ngoặc kép mà tôi không muốn.
  2. Lợi nhuận vận chuyển mà tôi không muốn.
  3. Nó lộn xộn. Truy vấn của tôi hiển thị tất cả các tên đầu tiên trước tiên, và sau đó tất cả các tên cuối cùng. Tuy nhiên, tôi muốn cặp đầu tiên, cuối cùng.
+0

Thực ra tôi đang sử dụng bộ xử lý dòng lệnh json có tên là jq - http://stedolan.github.io/jq/manual/ – San

Trả lời

115

tôi khuyên bạn nên sử dụng String Interpolation:

jq '.users[] | "\(.first) \(.last)"' 

reference

+4

đây là tốt hơn nhiều nếu dữ liệu của bạn là số – ozOli

+1

tại sao tính năng này hoạt động? Tôi có thể tìm thêm về cú pháp "\ (...)" ở đâu? – spazm

+1

https://stedolan.github.io/jq/manual/#Stringinterpolation-%5C%28foo%29 –

88

Bạn có thể sử dụng addition để nối chuỗi.

Chuỗi được thêm bằng cách tham gia vào chuỗi lớn hơn.

jq '.users[] | .first + " " + .last' 
+16

Để loại bỏ các dấu ngoặc kép JSON, hãy gọi jq bằng tùy chọn -r, ví dụ: jq -r '.users [] | .first + "" + .last ' – peak

+1

+1, nhưng đối với trường hợp sử dụng của tôi, tôi đang cố gắng định dạng hai số trên cùng một hàng.Cách tiếp cận này không thành công vì nó không thể thêm '" "' vào một số. Câu trả lời của Eric cho kết quả tốt hơn cho trường hợp này. – Synesso

+1

@Synesso: '(.numA | tostring) +" "+ (.numB | tostring)' sẽ hoạt động. Hoặc sử dụng nội suy chuỗi thay vì: '" \ (. NumA) \ (. NumB) "'. –

5

Trong khi cả hai câu trả lời ở trên làm việc tốt nếu chìa khóa, giá trị được chuỗi, tôi đã có một tình huống để nối thêm một chuỗi và số nguyên (lỗi JQ sử dụng các biểu thức ở trên)

Yêu cầu: Để xây dựng URL dưới đây json

[email protected]>curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | jq .[0] 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 251 100 251 0  0 155k  0 --:--:-- --:--:-- --:--:-- 245k 
{ 
    "Node": "myconsul", 
    "Address": "192.168.99.103", 
    "ServiceID": "4ce41e90ede4:compassionate_wozniak:443", 
    "ServiceName": "apache-443", 
    "ServiceTags": [], 
    "ServiceAddress": "", 
    "ServicePort": 1443, 
    "ServiceEnableTagOverride": false, 
    "CreateIndex": 45, 
    "ModifyIndex": 45 
} 

giải pháp:

curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | 
jq '.[0] | "http://" + .Address + ":" + "\(.ServicePort)"' 
+0

lưu ý rằng thoát khỏi dấu đóng ngoặc là không cần thiết, và sẽ sai. – nymo

+0

@nymo: Đó không phải là thoát. '\ (...)' là nội suy chuỗi. Ở đây nó biến số '.ServicePort' thành chuỗi. Nội suy có thể được sử dụng thay cho các dấu hiệu '+' để làm cho giải pháp này ngắn hơn. –

0

tôi đã khá gần với những gì tôi muốn bằng cách làm một cái gì đó như thế này

cat my.json | jq '.my.prefix[] | .primary_key + ":", (.sub.prefix[] | " - " + .sub_key)' | tr -d '"' 

Kết quả trong số đó là đủ gần để YAML cho tôi để thường nhập nó vào các công cụ khác mà không có nhiều vấn đề. (Tôi vẫn đang tìm cách để basicallt xuất một tập con của json đầu vào)

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