Cách nhận tên khóa từ JSON bằng jq


128

curl http://testhost.test.com:8080/application/app/version | jq '.version' | jq '.[]'

Lệnh trên chỉ xuất ra các giá trị như dưới đây:

"madireddy@test.com"

"2323"

"test"

"02-03-2014-13:41"

"application"

Làm thế nào tôi có thể nhận được các tên chính thay vì như dưới đây:

email

versionID

context

date

versionName

như thế này . Anubhava..version: {"Archiver-Version": "Plexus Archiver", "Build-Id": "", "Build-Jdk": "1.7.0_07", "Build-Number": "", "Build- Tag ":" "," Được xây dựng bởi ":" cporter "," created-By ":" Apache Maven "," Thực hiện-Tiêu đề ":" Northstar "," Id-Vendor-Id ": com com.test. testPack "," Phiên bản thực hiện ": Hồi testBox", "Phiên bản đơn nhất": "1.0", "tên ứng dụng": Hồi testApp "," ngày xây dựng ":" 02-03-2014-13: 41 "," phiên bản ":" testBox ",

Bạn có thể vui lòng thêm dữ liệu mẫu ra khỏi API và được nhập vào jqkhông?
— Carl G

Câu trả lời:


181

Bạn có thể dùng:

$ jq 'keys' file.json
$ cat file.json:
{ "Archiver-Version" : "Plexus Archiver", "Build-Id" : "", "Build-Jdk" : "1.7.0_07", "Build-Number" : "", "Build-Tag" : "", "Built-By" : "cporter", "Created-By" : "Apache Maven", "Implementation-Title" : "northstar", "Implementation-Vendor-Id" : "com.test.testPack", "Implementation-Version" : "testBox", "Manifest-Version" : "1.0", "appname" : "testApp", "build-date" : "02-03-2014-13:41", "version" : "testBox" }

$ jq 'keys' file.json
[
  "Archiver-Version",
  "Build-Id",
  "Build-Jdk",
  "Build-Number",
  "Build-Tag",
  "Built-By",
  "Created-By",
  "Implementation-Title",
  "Implementation-Vendor-Id",
  "Implementation-Version",
  "Manifest-Version",
  "appname",
  "build-date",
  "version"
]

CẬP NHẬT: Để tạo một mảng BASH bằng các phím sau:

Sử dụng BASH 4+:

mapfile -t arr < <(jq -r 'keys[]' ms.json)

Trên BASH cũ hơn bạn có thể làm:

arr=()
while IFS='' read -r line; do
   arr+=("$line")
done < <(jq 'keys[]' ms.json)

Sau đó in nó:

printf "%s\n" ${arr[@]}

"Archiver-Version"
"Build-Id"
"Build-Jdk"
"Build-Number"
"Build-Tag"
"Built-By"
"Created-By"
"Implementation-Title"
"Implementation-Vendor-Id"
"Implementation-Version"
"Manifest-Version"
"appname"
"build-date"
"version"

Cảm ơn bạn đã làm việc! Tôi đang gán các giá trị này thành mảng trong tập lệnh Shell như mảng = ($ keyContents) nhưng nó không được gán đúng, Có cách nào để gán giá trị cho mảng đề cập đến các dấu phân cách không?
— Ezhilan Mahalingam

Bất cứ khi nào khóa / giá trị có không gian trong đó, mảng sẽ coi nó là giá trị mới, tôi thay thế khoảng trắng bằng _ giải quyết vấn đề. Cảm ơn rât nhiều! Nhưng bây giờ một vấn đề nữa. : (Tôi đang nhận các đơn đặt hàng khác nhau khi tôi nhận được các khóa một mình và khi tôi nhận được các giá trị một mình: (
— Ezhilan Mahalingam

2
Sử dụng mapfile -t arr < <(jq -r 'keys[]' ms.json)thay vì quá trình thay thế xấu xí đó để tránh gặp vấn đề với khoảng trắng trong các phím.
— Niklas Holm

1
@anubhava, nếu mapfile không có sẵn thì một cái cũ arr=(); while IFS='' read -r line; do arr+=("$line"); done < <(...)cũng sẽ làm được.
— Niklas Holm

2
Có thể muốn đề cập keys_unsortedđể có được các phím theo thứ tự tài liệu.
— Jeff Mercado

30

Bạn cần sử dụng jq 'keys[]'. Ví dụ:

echo '{"example1" : 1, "example2" : 2, "example3" : 3}' | jq 'keys[]'

Sẽ xuất ra một danh sách tách dòng:

"example1"
"example2"
"example3"

10

Kết hợp với câu trả lời ở trên, bạn muốn hỏi jq cho đầu ra thô, vì vậy bộ lọc cuối cùng của bạn phải là:

     cat input.json | jq -r 'keys'

Từ jq giúp:

     -r     output raw strings, not JSON texts;

Đây là một bashkịch bản khó hiểu gotcha - nếu bạn không chỉ định -rthì bạn sẽ nhận được một chuỗi trích dẫn, trông rất đẹp trên màn hình, nhưng bạn thường không muốn các trích dẫn được nhúng trong chuỗi.
— MarkHu

4
Sử dụng vô dụng của mèo
— 0andriy

5

Để in các phím trên một dòng là csv:

echo '{"b":"2","a":"1"}' | jq -r 'keys | [ .[] | tostring ] | @csv'

Đầu ra:

"a","b"

Đối với tính đầy đủ của csv ... để in các giá trị trên một dòng dưới dạng csv:

echo '{"b":"2","a":"1"}' | jq -rS . | jq -r '. | [ .[] | tostring ] | @csv'

Đầu ra:

"1","2"

4

echo '{"ab": 1, "cd": 2}' | jq -r 'keys[]' in tất cả các khóa một phím trên mỗi dòng mà không có dấu ngoặc kép.

ab
cd

3

Để lấy các khóa trên một nút sâu hơn trong JSON:

echo '{"data": "1", "user": { "name": 2, "phone": 3 } }' | jq '.user | keys[]'
"name"
"phone"

0

Đây là một cách khác để lấy một mảng Bash với ví dụ JSON được đưa ra bởi @anubhava trong câu trả lời của anh ấy:

arr=($(jq --raw-output 'keys_unsorted | @sh' file.json))

echo ${arr[0]}    # 'Archiver-Version'
echo ${arr[1]}    # 'Build-Id'
echo ${arr[2]}    # 'Build-Jdk'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.