Trình phân tích cú pháp JSON dòng lệnh Unix? [đóng cửa]


128

Bất cứ ai cũng có thể đề xuất một trình phân tích cú pháp JSON (chọn hương vị của bạn) có thể được sử dụng để hướng nội các giá trị từ một phản hồi JSON trong một đường ống dẫn?


Tôi thích sử dụng pythonpy ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
RussellStewart



1
Có một công cụ mới trong thị trấn: ramda-cli , sử dụng cú pháp api và LiveScript của Ramda. Nó được xây dựng để lấy json làm chức năng nhập và soạn. npm install -g ramda-cli
Ehvince

Câu trả lời:


18

Bạn có thể sử dụng trình phân tích cú pháp dòng lệnh này (mà bạn có thể đặt vào bí danh bash nếu muốn), sử dụng các mô-đun được tích hợp trong lõi Perl:

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'

1
Tôi bối rối bởi đầu ra của điều này. Đầu ra bao gồm các mũi tên chất béo (=>) giữa các khóa và giá trị. Đây không phải là JSON.
Landon Kuhn

7
@landon: không, đầu vào là JSON và đầu ra là cấu trúc dữ liệu gốc Perl, sau đó bạn có thể tiếp tục thao tác nếu cần. Điểm của một lớp lót này là nó tạo ra dữ liệu dễ đọc hơn nhiều.
Ether

1
Nếu bạn muốn có một đầu ra JSON, bạn có thể sử dụng lớp lót Perl này:perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov

232

Tôi thích python -m json.toolcái dường như có sẵn trên mỗi mặc định trên hầu hết các hệ điều hành * nix mỗi mặc định.

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

Nhưng cần lưu ý rằng điều này sẽ sắp xếp tất cả các khóa theo thứ tự bảng chữ cái, hoặc có thể là một điều tốt trong đó json được tạo bởi một số ngôn ngữ sử dụng HashMaps không có thứ tự ...


5
Câu trả lời không nản lòng. Đây là một thay thế dòng lệnh tốt đẹp nếu mục tiêu là xác thực một tệp JSON đã cho là có chứa JSON hợp lệ.
scorpiodawg

10
câu trả lời này không mô tả cách kiểm tra các giá trị của khóa được chỉ định.
Colin Su

8
@ColinSu nhưng đó cũng không phải là câu hỏi ban đầu. json.toolchỉ là một bàn tay ngắn để in json đẹp. Nếu bạn cần trích xuất / thao tác dữ liệu json trong tập lệnh shell, tôi sẽ sử dụng dữ liệu hoàn jqtoàn tuyệt vời ở những gì đang diễn ra ...
muhqu

@muhqu yeah, tôi biết, tôi sử dụng json.toolmười lần mỗi ngày. Tôi nghĩ rằng tôi đã đọc sai ý nghĩa của "introspec" trong câu hỏi, cảm ơn bạn đã chỉ ra.
Colin Su

1
IMMO đây là một câu trả lời không chính xác bởi vì python json.toolchỉ thực hiện hai điều: json xác thực và in đẹp. Nó KHÔNG hướng nội các giá trị trong json như jqkhông.
Devy

144

Nếu bạn đang tìm kiếm một công cụ biên dịch C di động:

http://stedolan.github.com/jq/

Từ trang web:

jq giống như sed cho dữ liệu JSON - bạn có thể sử dụng nó để cắt và lọc và ánh xạ và biến đổi dữ liệu có cấu trúc một cách dễ dàng mà sed , awk , grep và bạn bè cho phép bạn chơi với văn bản.

jq có thể thu thập định dạng dữ liệu mà bạn có thành một định dạng mà bạn muốn với rất ít nỗ lực và chương trình để làm điều đó thường ngắn hơn và đơn giản hơn bạn mong đợi.

Hướng dẫn : http://stedolan.github.com/jq/tutorial/
Hướng dẫn : http://stedolan.github.com/jq/manual/
Tải xuống : http://stedolan.github.com/jq/doad/


20
Câu trả lời tốt nhất ở đây imo. Không phụ thuộc nặng nề, nhỏ, mạnh mẽ, tài liệu tốt và dễ dàng để thử nó. Cảm ơn rất nhiều vì đã gợi ý điều này!
FrozenCow

Trên Ubuntu / Debian bạn chỉ có thể apt install jq.
Pablo A

Tôi đã hỏi điều này nhiều lần trước, và đã học cách yêu jq.
Jé Queue

63

Tôi đã tạo một mô-đun được thiết kế riêng cho thao tác JSON dòng lệnh:

https://github.com/ddopson/underscore-cli

  • LINH HOẠT - Công cụ "dao-quân-dao" để xử lý dữ liệu JSON - có thể được sử dụng như một máy in đẹp đơn giản hoặc như một dòng lệnh Javascript được cung cấp đầy đủ
  • POWERFUL - Thể hiện toàn bộ sức mạnh và chức năng của underscore.js (cộng với underscore.opes)
  • SIMPLE - Làm cho nó đơn giản để viết một lớp lót JS tương tự như sử dụng "perl -pe"
  • CHAINED - Nhiều lệnh gọi có thể được nối lại với nhau để tạo ra một đường ống xử lý dữ liệu
  • MULTI-FORMAT - Hỗ trợ phong phú cho các định dạng đầu vào / đầu ra - in ấn đẹp, JSON nghiêm ngặt, vv [sắp ra mắt]
  • TÀI LIỆU - Tài liệu dòng lệnh tuyệt vời với nhiều ví dụ cho mỗi lệnh

Nó cho phép bạn làm những việc mạnh mẽ thực sự dễ dàng:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

Và nó có một trong các trình định dạng JSON "khoảng trắng thông minh" tốt nhất hiện có:

Nếu bạn có bất kỳ yêu cầu tính năng nào, hãy bình luận về bài đăng này hoặc thêm một vấn đề trong github. Tôi rất vui khi ưu tiên các tính năng cần thiết cho các thành viên của cộng đồng.


Tuyệt vời! Nhưng, có thể chạy các lệnh console trên dữ liệu JSON không? Ví dụ: được cung cấp một tệp JSON có một mảng URL, wgetmỗi URL.
Camilo Martin

@CamiloMartin - cách dễ nhất để làm điều đó là in ra các URL, một URL trên mỗi dòng và sau đó chạy nó thông qua xargs hoặc GNU song song.
Dave Dopson

@DaveDopson Tôi có thể sử dụng underscoređể phân tích json lồng nhau có các đối tượng và mảng lồng nhau không?
227666

1
@ user227666 - chắc chắn rồi. JSON hỗ trợ lồng nhau nhiều cấp độ của các đối tượng. Hoặc bạn có thể có nghĩa là JSON có một chuỗi mã hóa JSON hơn nữa. Mà cũng hoạt động, nhưng chỉ cần một chút munging.
Dave Dopson

@DaveDopson Không hỗ trợ gạch dưới "có chứa" một "mẫu", nghĩa là. đối với một "khóa" cụ thể, tập hợp các giá trị (không phân biệt chữ hoa) có thể có? Tôi đã thử "jq" với trận đấu, nhưng nó không hoạt động. Cũng đã đăng trường hợp sử dụng hoàn chỉnh của tôi ở đây - stackoverflow.com/questions/25463196/ cấp
ekta

13

Thanh toán TickTick .

Đó là một trình phân tích cú pháp Bash JSON thực sự.

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``

Phải yêu công cụ cấp vỏ :)
Jé Queue

12

Ngoài ra còn có bộ công cụ xử lý dòng lệnh JSON nếu bạn tình cờ có node.js và npm trong ngăn xếp của bạn.

Và một lệnh "json" khác để tạo khối JSON trên dòng lệnh Unix của bạn.

Và đây là những lựa chọn thay thế khác:


Liên quan: Công cụ dòng lệnh để phân tích cú pháp đầu vào JSON cho Unix?


Dễ dàng cài đặt, trên Ubuntu: sudo apt-get install python-pip && sudo pip cài đặt jsonpipe
activout.se

@ spliteandconquer.se Xin lỗi nhưng bạn cài đặt công cụ này bằng npm với npm install json.
gitaarik

@rednaw Thật không may, gói NPM jsondường như bị chiếm bởi một gói hoàn toàn khác.
Brad

8

Bất cứ ai cũng đề cập đến Jshon hoặc JSON.sh?

https://github.com/keenerd/jshon

pipe json với nó, và nó đi ngang qua các đối tượng json và in ra đường dẫn đến đối tượng hiện tại (dưới dạng một mảng JSON) và sau đó là đối tượng, không có khoảng trắng.

http://kmkeen.com/jshon/
Jshon tải văn bản json từ stdin, thực hiện các hành động, sau đó hiển thị hành động cuối cùng trên thiết bị xuất chuẩn và cũng được coi là một phần của đường dẫn xử lý văn bản thông thường.


Ví dụ sử dụng trên OSX : brew install jshon,cat *.json | jshon
kenorb

2

Bạn có thể thử jsawk như đề xuất trong câu trả lời này .

Thực sự bạn có thể đánh lên một kịch bản python nhanh để làm điều này mặc dù.


1

Đối với Bash / Python , đây là một trình bao bọc cơ bản xung quanh python simplejson:

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

Nó thực sự chỉ xử lý kiểu dữ liệu từ điển lồng nhau, nhưng nó hoạt động cho những gì tôi cần, và rất hữu ích cho việc đi qua json. Nó có thể thích nghi với hương vị.

Dù sao, một cái gì đó nhà cho những người không muốn nguồn trong một phụ thuộc bên ngoài khác. Ngoại trừ trăn, tất nhiên.

Ví dụ. json_parser {field1} {field2}sẽ chạy print myjson['{field1}']['{field2}'], mang lại các khóa hoặc các giá trị được liên kết với {field2}, được phân tách bằng dấu cách.


0

Tôi chỉ tạo ra jkid , một trình thám hiểm json dòng lệnh nhỏ mà tôi đã thực hiện để dễ dàng khám phá các đối tượng json lớn. Các đối tượng có thể được khám phá "theo chiều ngang" và có tùy chọn "xem trước" để tránh tràn giao diện điều khiển.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}

Làm thế nào tôi có thể cài đặt jkidtrong mac?
227666
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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.