Làm cách nào tôi có thể in JSON đẹp trong tập lệnh shell?


3061

Có tập lệnh shell (Unix) để định dạng JSON ở dạng người có thể đọc được không?

Về cơ bản, tôi muốn nó biến đổi như sau:

{ "foo": "lorem", "bar": "ipsum" }

... thành một cái gì đó như thế này:

{
    "foo": "lorem",
    "bar": "ipsum"
}


7
Tôi đã tự quay lại một lúc ngắn: github.com/exhuma/braindump/tree/master/jsonformat Mã này rất đơn giản, sử dụng jsonthư viện riêng của python , nhưng tôi cũng đã thêm pygments để làm nổi bật cú pháp.
shoutuma

Tình cờ gặp phải điều này nhưng sau đó tìm thấy Json Pretty và tôi khá thích nó. Typekit sử dụng nó trong các ví dụ API của họ, vì vậy có một số klout đằng sau nó ^^
Nick Tomlin

Nếu bạn không ngại sao chép, cũng có một số công cụ đơn giản trực tuyến như jsonprettyprint.net nơi bạn có thể nhanh chóng in JSON thô của mình.
Javaaaa

7
Được cảnh báo: python -m json.tool không phải lúc nào cũng tạo ra JSON hợp lệ. (Gợi ý: 1e1000)
cao điểm

Câu trả lời:


4460

Với Python 2.6+ bạn chỉ có thể làm:

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool

hoặc, nếu JSON nằm trong một tệp, bạn có thể làm:

python -m json.tool my_json.json

nếu JSON là từ một nguồn internet như API, bạn có thể sử dụng

curl http://my_url/ | python -m json.tool

Để thuận tiện trong tất cả các trường hợp này, bạn có thể tạo bí danh:

alias prettyjson='python -m json.tool'

Để thuận tiện hơn nữa với việc gõ thêm một chút để sẵn sàng:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}

cho tất cả các trường hợp trên. Bạn có thể đặt cái này vào .bashrcvà nó sẽ có sẵn mỗi lần trong vỏ. Gọi nó như thế nào prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


73
Bạn có thể dẫn nó lên pygmentize -l javascriptđể có được đầu ra màu cú pháp trong dòng lệnh của bạn. Chỉnh sửa : Nếu bạn đã cài đặt pygments.
Shrikant Sharat

177
Một câu trả lời tuyệt vời, chỉ cảnh cáo tôi có với nó là nó không sắp xếp các phím trên đầu ra - mà bạn có thể cần phải nhận thức được.
Chris Nash

14
Trong myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu

40
Điều này dường như thoát các ký tự Unicode vào \ uXXXX, đây có thể là một bất lợi.
dùng1071136

14
Tôi đã tạo một bí danh: alias pretty='python -mjson.tool | pygmentize -l jsonđể tôi có thể chạy : command params | pretty. Hi vọng điêu nay co ich. PS: Nếu ai đó có thể mở rộng điều này thành a) loại bỏ đầu ra curl mà tôi thấy mỗi lần và / hoặc b) KHÔNG sắp xếp các phím json; xin vui lòng cho tôi biết, tôi sẽ rất biết ơn.
Clint Eastwood

1023

Bạn có thể dùng: jq

Nó rất đơn giản để sử dụng và nó hoạt động rất tốt! Nó có thể xử lý các cấu trúc JSON rất lớn, bao gồm cả các luồng. Bạn có thể tìm thấy hướng dẫn của họ ở đây .

Ví dụ sử dụng:

$ jq --color-output . file1.json file1.json | less -R

$ command_with_json_output | jq .

$ jq . # stdin/"interactive" mode, just enter some JSON

$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

Các . là bộ lọc danh tính.


11
Ngoài ra còn có một --sort-keystùy chọn, hữu ích trong một số trường hợp.
Matthew Flaschen

9
Làm việc với curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Hover Ruan

19
"jq." là một máy in đẹp, nhưng nó đi kèm với một cảnh báo: jq (lên đến và bao gồm cả jq phiên bản 1.5) sẽ thay đổi các giá trị của các số rất lớn và rất nhỏ vì nó phân tích các giá trị số dưới dạng giá trị 64 bit 64 bit của IEEE. Để kiểm tra xem máy in đẹp yêu thích của bạn có gặp vấn đề tương tự hay không, hãy thử giá trị này: 1e1000. Lưu ý rằng python -mjson.tool thất bại trong bài kiểm tra này vì nó tạo ra Infinity, thậm chí không phải là JSON.
cao điểm

1
Lưu ý, bạn có thể chuyển hướng kết quả được định dạng sang tệp : echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Chad

26
@Meekohi thay thế là "sử dụng tiếng vang không cần thiết". Siêu hạnh phúc khi tìm thấy <<<nhà điều hành - chính xác những gì tôi đang tìm kiếm.
jchook

381

Tôi sử dụng đối số "khoảng trắng" JSON.stringifyđể in JSON đẹp trong JavaScript.

Ví dụ:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);

// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

Từ dòng lệnh Unix với Node.js, chỉ định JSON trên dòng lệnh:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

Trả về:

{
    "foo": "lorem",
    "bar": "ipsum"
}

Từ dòng lệnh Unix với Node.js, chỉ định tên tệp có chứa JSON và sử dụng thụt bốn khoảng trắng:

$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json

Sử dụng đường ống:

echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
 s=process.openStdin();\
 d=[];\
 s.on('data',function(c){\
   d.push(c);\
 });\
 s.on('end',function(){\
   console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
 });\
"

10
Để gỡ lỗi các đối tượng trong Node.js, bạn thực sự nên sử dụng sys.inspect () thay vì JSON.opesify (). Đây là lý do: markhansen.co.nz/inspecting-with-json-opesify
Gurpartap Singh

11
Bị hạ bệ. OP nói về "tập lệnh dòng lệnh * nix" và câu trả lời này là một bối cảnh khác.
danorton

49
@danorton: JS có thể được sử dụng từ dòng lệnh thông qua node.js và các giải pháp tương tự khác.
calvinf

10
Không cần giao diện điều khiển: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"cũng đưa ra kết quả cho STDOUT.
Julian D.

2
Thật tệ khi kịch bản khác với tên tệp so với stdin
Lukasz Wiktor

340

Tôi đã viết một công cụ có một trong những trình định dạng "khoảng trắng thông minh" tốt nhất hiện có. Nó tạo ra đầu ra dài dòng và dễ đọc hơn hầu hết các tùy chọn khác ở đây.

gạch dưới

Đây là những gì "khoảng trắng thông minh" trông giống như:

Tôi có thể hơi thiên vị, nhưng nó là một công cụ tuyệt vời để in và thao tác dữ liệu JSON từ dòng lệnh. Nó rất thân thiện để sử dụng và có tài liệu / trợ giúp dòng lệnh mở rộng. Đó là một con dao của quân đội Thụy Sĩ mà tôi sử dụng cho 1001 nhiệm vụ nhỏ khác nhau sẽ gây khó chịu một cách đáng ngạc nhiên khi làm bất kỳ cách nào khác.

Trường hợp sử dụng mới nhất: Chrome, bảng điều khiển Dev, tab Mạng, xuất tất cả dưới dạng tệp HAR, "cat site.har | gạch dưới chọn '.url' --outfmt text | grep mydomain"; bây giờ tôi có một danh sách theo thứ tự thời gian của tất cả các lần tải URL được thực hiện trong quá trình tải trang web của công ty tôi.

In đẹp dễ dàng:

underscore -i data.json print

Điều tương tự:

cat data.json | underscore print

Điều tương tự, rõ ràng hơn:

cat data.json | underscore print --outfmt pretty

Công cụ này là dự án đam mê hiện tại của tôi, vì vậy nếu bạn có bất kỳ yêu cầu tính năng nào, rất có thể tôi sẽ giải quyết chúng.


4
Tôi cũng đã cập nhật ~ / .bash_profile của mình để có dòng sau: alias underscor = 'underscore print --outfmt khá' bây giờ tôi chỉ có thể thực hiện curl example.com/result.json | gạch dưới và vẫn sử dụng dấu gạch dưới cho định dạng khác
Gal Bracha

Cảm ơn Dave! Công cụ là tốt! alias beautiful-json = "underrsore beautiful" và đầu ra cong làm hài lòng
Maxim Ponomarev

Công cụ định dạng tuyệt vời, chỉ cần một lưu ý: chuyển tiếp đầu ra sang tệp (có tùy chọn -o hoặc với > ) chỉ hoạt động với bản in gạch dưới . gạch khá tiết kiệm một tập tin với định dạng dấu hiệu màu được chèn, smth như: [32m, [33m, [39mcùng với một số không thể in được trước mỗi trong số họ, mà làm cho JSON không hợp lệ. Tuy nhiên, in dấu gạch dưới một mình không thêm bất cứ điều gì vào một tệp và thực hiện công việc định dạng của nó một cách hoàn hảo.
tiurin

Tôi thích jqnhưng điều này đã làm việc rất tốt cho "JSON" của tôi không có khóa được trích dẫn gấp đôi.
Bluu

@DaveDopson cảm ơn vì công cụ tuyệt vời !! Gonna thử sử dụng nó cùng với jsonselect.org/#tryit ...
mycargus

173

Tôi thường chỉ làm:

echo '{"test":1,"test2":2}' | python -mjson.tool

Và để truy xuất dữ liệu đã chọn (trong trường hợp này, giá trị của "test"):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

Nếu dữ liệu JSON nằm trong một tệp:

python -mjson.tool filename.json

Nếu bạn muốn thực hiện tất cả trong một lần với curldòng lệnh bằng mã xác thực:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

nếu json được cho là đến trực tiếp từ http api thì đây cũng là một công cụ hay được triển khai trong python: github.com/jkbr/httpie
Florian

Nếu bạn đã cài đặt nút (và đừng bận tâm đến đầu ra kiểu YAML) thì cũng có gói này: rafeca.com/prettyjson để bạn có thể kết thúc một cuộn tròn với | prettyjson
Iolo

3
Như đã lưu ý ở trên, một trong những vấn đề với python -mjson.tool với tư cách là một máy in đẹp JSON là nó không phải lúc nào cũng phát ra JSON. Ví dụ: 1e1000 trở thành Vô cực (dù sử dụng python 2.x hay 3.x). 'jq.' luôn tạo ra JSON, nhưng nó không đảm bảo rằng các giá trị rất lớn (hoặc rất nhỏ) được bảo tồn chính xác.
cao điểm

88

Nhờ các con trỏ rất hữu ích của JF Sebastian, đây là một kịch bản nâng cao một chút mà tôi đã nghĩ ra:

#!/usr/bin/python

"""
Convert JSON data to human-readable form.

Usage:
  prettyJSON.py inputFile [outputFile]
"""

import sys
import simplejson as json


def main(args):
    try:
        if args[1] == '-':
            inputFile = sys.stdin
        else:
            inputFile = open(args[1])
        input = json.load(inputFile)
        inputFile.close()
    except IndexError:
        usage()
        return False
    if len(args) < 3:
        print json.dumps(input, sort_keys = False, indent = 4)
    else:
        outputFile = open(args[2], "w")
        json.dump(input, outputFile, sort_keys = False, indent = 4)
        outputFile.close()
    return True


def usage():
    print __doc__


if __name__ == "__main__":
    sys.exit(not main(sys.argv))

3
Khi các giá trị được tải vào từ điển, thứ tự bị mất: dictcác đối tượng bình thường không có thứ tự xác định. Hãy thử json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)và bạn sẽ thấy họ đổi chỗ. Để sửa nó, nhập OrderedDictloadchuyển object_pairs_hook=OrderedDict.
icktoofay

Bạn có thể thay đổi tập lệnh để đọc từ đầu vào tiêu chuẩn với điều này : inputFile = sys.stdin. Điều này cho phép bạn chuyển nội dung theo kịch bản như sau:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson

1
Và để tránh sắp xếp với nhận xét của @ icktoofay, hãy nhập OrderedDict như thế này : from collections import OrderedDict.
Hugo

2
Cảm ơn @icktoofay. Điều này cho phép tôi tạo chức năng vim sau: com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))" Lưu ý rằng các dấu phân cách phải được đặt là (',', ':') để tránh khoảng trắng theo dõi được thêm vào: bug.python.org/su16333
blindsnowmobile

Đoạn trích tuyệt vời! Tôi đã sử dụng sort_keys = Truethay thế, vì tôi muốn sử dụng điều này để so sánh các tệp json và nó hoạt động như một bùa mê.
JL Peyret

81

Nếu bạn sử dụng npm và Node.js, bạn có thể thực hiện npm install -g jsonvà sau đó chuyển lệnh qua json. Làm json -hđể có được tất cả các tùy chọn. Nó cũng có thể kéo ra các trường cụ thể và tô màu đầu ra với -i.

curl -s http://search.twitter.com/search.json?q=node.js | json

79

Nó không quá đơn giản với một cách riêng với các công cụ jq .

Ví dụ:

cat xxx | jq .

7
CẢNH BÁO: jq mã hóa các số dưới dạng float 754 64 bit, và do đó, đại diện của chúng có thể thay đổi. Độ chính xác của số lượng rất nhỏ và rất lớn có khả năng bị mất. Để kiểm tra xem máy in đẹp yêu thích của bạn có gặp vấn đề tương tự hay không, hãy thử giá trị này: 1e1000.
cao điểm

5
hoặc đơn giản là : jq . file.json; nhưng cũng cat file.json | jq(không có bộ lọc .) cũng hoạt động. (trên Ubuntu / linux; ymmv trên các nền tảng)
michael

73

Với Perl, sử dụng mô-đun CPAN JSON::XS. Nó cài đặt một công cụ dòng lệnhjson_xs .

Xác thực:

json_xs -t null < myfile.json

Sắp xếp lại tệp JSON src.jsonthành pretty.json:

< src.json json_xs > pretty.json

Nếu bạn không có json_xs, hãy thử json_pp. "Pp" chỉ dành cho "thuần perl" - công cụ chỉ được triển khai trong Perl, không có ràng buộc với thư viện C bên ngoài (đó là những gì XS đại diện cho "Hệ thống mở rộng" của Perl).


9
Có vẻ là tiêu chuẩn với Cygwin!
Janus Troelsen

12
json_pp có thể được sử dụng theo cùng một cách và có thể dễ dàng cài đặt nhất trên hệ thống của bạn (trên Debian, nó nằm trong gói 'perl').
MichielB

8
FYI, trên hệ thống Mac OS X 10.9 của tôi, json_pp có sẵn tự động.
Gregg Williams

-t nullđã cho tôi null: không phải là một toformat hợp lệ ... nhưng để nó hoạt động tuyệt vời. Cảm ơn.
Lucas

pp dành cho perl thuần túy, không in đẹp ở đây :) Vì json_xs và json_pp có thể làm nhiều hơn là chỉ in đẹp và còn với -json_opt làm những việc khác thay vì in đẹp. Mặc dù in ấn đẹp là hành vi mặc định.
Kjetil S.

70

Trên * nix, đọc từ stdin và viết vào stdout hoạt động tốt hơn:

#!/usr/bin/env python
"""
Convert JSON data to human-readable form.

(Reads from stdin and writes to stdout)
"""

import sys
try:
    import simplejson as json
except:
    import json

print json.dumps(json.loads(sys.stdin.read()), indent=4)
sys.exit(0)

Đặt cái này trong một tập tin (tôi đặt tên của tôi là "beautifulJSON" theo câu trả lời của AnC ) trong PATH của bạn và chmod +xnó, và bạn thật tuyệt.


Thật vậy, sử dụng stdin / stdout linh hoạt và đơn giản hơn nhiều. Cảm ơn đã chỉ ra điều đó.
AnC

3
Đối với các chương trình mong đợi một tệp được đặt tên, sử dụng / dev / stdin, ditto cho out và err.
dvogel

4
FYI fileinput.input()đọc từ stdin nếu không có tệp nào được đưa ra tại một dòng lệnh. Ví dụ
jfs

fileinput.input () không thể xử lý tốt các tệp không có dòng mới ở cuối, lần trước tôi đã kiểm tra.
Zachary Vance

Anh hỏi trong shell script chứ không phải python ngôn ngữ khác. Với JQ có thể làm điều đó một cách hoàn hảo.
Bùi Anh Tuấn

65

JSON Ruby Gem được gói cùng với một tập lệnh shell để cải thiện JSON:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

Tải xuống tập lệnh: gist.github.com/3738968


6
Lưu ý rằng giải pháp này giải mã các chuỗi thoát unicode "\ uxxxx", không giống như giải pháp Python với json.tool. Tuy nhiên, nó cũng có vẻ có giới hạn độ sâu lồng nhau ( nesting of 20 is too deep (JSON::NestingError)).
a3nm

2
trên Ubuntu bạn có thể làm: sudo apt-get install ruby-json-purethay vìgem install
Janus Troelsen

1
`` `eric-mbp: ~ ericstob $ sudo gem install json Mật khẩu: Fetching: json-1.7.3.gem (100%) Xây dựng các tiện ích mở rộng riêng. Việc này có thể mất một lúc ... Đã cài đặt thành công json-1.7.3 1 gem đã cài đặt Cài đặt tài liệu ri cho json-1.7.3 ... Cài đặt tài liệu RDoc cho json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: lệnh không được tìm thấy
Eric Hartford

có lẽ bạn có thể đăng nội dung của bạn prettify_json.rb?
Andrew

Bạn có thể tải xuống tập lệnh, di chuyển nó vào ~/binthư mục của bạn (đảm bảo rằng nó trong PATH của bạn) đổi tên prettify_json.rbthành ppjvà chạy chmod +x ppj. Bây giờ bạn có thể làm một cái gì đó nhưcurl www.jsonsring.com/something.json | ppj
Uri

58

CẬP NHẬT Tôi đang sử dụng jqnhư đề xuất trong câu trả lời khác. Nó cực kỳ mạnh mẽ trong việc lọc JSON, nhưng, ở mức cơ bản nhất, cũng là một cách tuyệt vời để in JSON đẹp để xem.

jsonpp là một máy in JSON dòng lệnh rất đẹp.

Từ README:

Các phản hồi dịch vụ web in đẹp như vậy:

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp

và làm đẹp các tệp chạy xung quanh đĩa của bạn:

jsonpp data/long_malformed.json

Nếu bạn đang dùng Mac OS X, bạn có thể brew install jsonpp. Nếu không, bạn có thể chỉ cần sao chép nhị phân vào một nơi nào đó trong $PATH.


1
Tôi đã thử jsonpp (được sử dụng trong quá khứ thành công) đối với một tệp khổng lồ (> 60MB). Tôi đã dừng nó sau 5 phút. Tôi đã dẫn nó vào python -mjson.tool(từ câu trả lời khác ở đây) và mất 10-20 giây ...
volker

60 MB JSON? Ồ Tôi thường không xử lý các tệp lớn nhưng hữu ích để biết. Cảm ơn.
jordelver

Trên hộp ubfox của tôi, tôi có một json_ppđịnh dạng json độc đáo, mặc dù có sự tương đồng trong cách đặt tên, tôi tin rằng đây là một dự án hoàn toàn khác với jsonppđề cập ở đây
davidpricedev

56

Đó là cách tôi làm:

curl yourUri | json_pp

Nó rút ngắn mã và hoàn thành công việc.


3
Máy chủ Ubuntu: Nếu bạn có các máy sản xuất có cài đặt rất hạn chế, đây có thể là lựa chọn tốt nhất vì nó được cài đặt theo mặc định dưới một tên cụ thể. Python thường được cài đặt theo nhiều cách khác nhau (ví dụ python3, python hoặc không hoàn toàn) tùy thuộc vào phiên bản.
jonathanjo

55

một tập lệnh bash đơn giản để in json đẹp

json_pretty.sh

#/bin/bash

grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'

Thí dụ:

cat file.json | json_pretty.sh

1
Cảm ơn vì bạn đã phản hồi. Tôi chỉ viết kịch bản này ngày hôm nay để sử dụng cá nhân và nó hoạt động tốt trong các trường hợp của tôi. Tôi đã sửa lỗi, bây giờ nó nhỏ hơn và không có vấn đề này. Không có mục tiêu để hỗ trợ định dạng hoàn toàn, nhưng tôi có thể thực hiện các sửa chữa khác nếu cần thiết.
Evgeny Karpov

2
Đó chỉ là câu trả lời làm việc mà tôi tìm thấy. Tôi có một linux nhúng - không rubby, không javascript, không truy cập internet để tải xuống các mô-đun python ... Tôi có một chút awk không hỗ trợ %*cký hiệu nên tôi đã thay đổi printfthành c=0; while (c++<offset) printf " "; printf $0;. Và awk của tôi có regex thoát khác nhau và dấu gạch chéo ngược không hoạt động []. Tôi đã thay đổi regexes thành /^[[{]//[]}]/.
Zaboj Campula

2
Điều này phải được chấp nhận, vì nó hoàn toàn tự nhiên và không yêu cầu phần mềm của bên thứ ba ...
Blag

1
@EvgenyKarpov bắt tốt, không cần quay lại hoàn toàn, chỉ cần grepxóa nhầm;)
Blag

1
Cảm ơn anh bạn, tôi muốn một cách nhanh chóng để định dạng một json 8-liner, trong bash đơn giản.
Ahmed M

53

Hãy thử pjson. Nó có màu sắc!

tiếng vang '{"json": "obj"} |  pjson

Cài đặt nó với pip:

⚡ pip install pjson

Và sau đó chuyển bất kỳ nội dung JSON nào sang pjson.


Nó đòi hỏi python-pip (sudo apt-get install python-pip) và sau đó (sudo pip install pjson) Ưu điểm lớn là màu sắc!
Kristjan Adojaan

1
Nhược điểm là không thể grep màu đầu ra.
Kristjan Adojaan

51
$ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
>                  sort_keys=True, indent=4))'
{
    "bar": "ipsum",
    "foo": "lorem"
}

LƯU Ý: Đây không phải cách để làm điều đó.

Tương tự trong Perl:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Lưu ý 2: Nếu bạn chạy

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

từ dễ đọc trở thành \ u được mã hóa

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

Nếu phần còn lại của đường ống của bạn sẽ xử lý unicode một cách duyên dáng và bạn muốn JSON của mình cũng thân thiện với con người, chỉ cần sử dụng ensure_ascii=False

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4, ensure_ascii=False)'

và bạn sẽ nhận được:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}

thực ra tôi cũng làm như vậy nhưng với chính javascript :)
Robert Gould

2
Trong phiên bản mô-đun JSON mà tôi có, to_jsondường như không chấp nhận các tùy chọn. Nhưng điều này hoạt động:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd

Ví dụ Python có thể được đơn giản hóa. Dễ dàng hơn nhiều để chuyển đầu ra JSON thẳng vào python -m json.tool.
Dan Loewenherz 17/03/2016

@Dan: vâng. Và có một số câu trả lời hiển thị json.toolví dụ mã. 1. phiên bản này cho phép bạn thay đổi một số tham số, ví dụ: indent2. Tại thời điểm đăng bài (2008) Python 2.4 vẫn được sử dụng mà không hỗ trợ-mjson.tool
jfs

40

Tôi sử dụng jshon để làm chính xác những gì bạn đang mô tả. Chỉ cần chạy:

echo $COMPACTED_JSON_TEXT | jshon

Bạn cũng có thể truyền các đối số để chuyển đổi dữ liệu JSON.


Cảm ơn, jshon nhanh hơn rất nhiều so với việc sử dụng python hoặc ruby ​​cho cùng một nhiệm vụ
Alexander

2
@Alexander - Bạn cần một máy in đẹp nhanh như thế nào? Tôi đang dùng OSx Lion đi kèm với Python được cài đặt sẵn. Với python -mjson.tool, tôi có thể in một tệp json 96KB trong 0,1 giây - đầu ra json của earthyh mà jshon liên kết đến là khoảng 24KB và tôi có thể in nó trong 0,08 giây. Jshon cho bạn nhanh hơn bao nhiêu?
joensson

1
Tôi đang làm việc với các tệp dữ liệu JSON được nén 1 + GB (thậm chí còn biết các tệp dữ liệu JSON không nén lớn đến mức nào, vì vậy tôi rất đánh giá cao đề xuất rằng jshon nhanh hơn.
Ryan Ballantyne

38

Hoặc, với Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

Điều đó cho tôi một lỗi. Bạn có cần một số gói ruby ​​json được cài đặt?
mjs

3
Có, bạn cần JSON Ruby Gem: sudo gem cài đặt json
darscan

@MatSchaffer Lưu ý rằng điều này không hoạt động nếu bạn đang sử dụng JSON để tuần tự hóa các đối tượng với các to_jsonphương thức tùy chỉnh ; Kernel#jjchỉ in các mảng và băm đẹp giống nhau (hoặc số / chuỗi / booleans).
Phrogz

Trên Windows, hãy thử điều này: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Ross Attrill 14/2/2016

36

Kiểm tra Jazor . Đó là một trình phân tích cú pháp JSON dòng lệnh đơn giản được viết bằng Ruby.

gem install jazor
jazor --help

4
Có phải chỉ mình tôi hay đây là gợi ý duy nhất thực sự trả lời câu hỏi của OP? Tôi đến đây để tìm kiếm một lệnh đơn giản để tôi có thể dẫn đầu ra curlvà đây là lệnh duy nhất đã làm điều đó cho tôi.
Leo Cassarani

2
Tôi thích rằng nó có tùy chọn để tô màu đầu ra. Làm cho nó dễ đọc hơn.
Andrew

ooh Tôi cũng thích tùy chọn truyền url vì tôi đang sử dụng tùy chọn này để xem đầu ra của API REST của tôi
Andrew

35

Bạn có thể sử dụng lệnh đơn giản này để đạt được kết quả:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

Câu trả lời tốt nhất theo ý kiến ​​của tôi. Nhỏ và dễ nhớ và không yêu cầu cài đặt bất kỳ công cụ không chuẩn nào.
Eugene C

python -m json.tool dường như không giữ nguyên thứ tự của đối tượng JSON.
PushNpop


28

Đơn giản chỉ cần dẫn đầu ra jq . .

Thí dụ:

twurl -H ads-api.twitter.com '.......' | jq .

Câu trả lời hay @Ackshaey Singh và người ta cũng có thể chuyển hướng tương tự đến một tệp một cách dễ dàng. ví dụcat <file_name.txt> | jq . > <output_name.txt>
Pramit

9
brew install jqnếu bạn đang trên mac os.
Distwo

1
Thật không may, sử dụng jq .để in đẹp có một nhược điểm tiềm năng : tất cả các phiên bản còn lại của jq đều khăng khăng coi các số JSON là số IEEE, do đó độ chính xác rất dễ bị mất, ví dụ như đối với các số nguyên rất lớn.
cao điểm

2
@Pramit cat file |luôn là một sự lãng phí của một quá trình; chỉ cần làm jq . <file_name.txt >output_name.txt(với nghĩa đen <>ký tự).
Mark Reed

24

Kết luận

Tôi kết hợp json.tool của Python với pyributionize:

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g

Có một số lựa chọn thay thế cho pyributionize được liệt kê trong câu trả lời này của tôi .

Đây là một bản demo trực tiếp:

Bản giới thiệu


5
Đôi khi một người cần sử dụng pygmentize -l jsonđể có được màu sắc.
JP

Cài đặt với gói apt python-pygments, tức làapt-get install python-pygments
Tháng Một

23

Với Perl, nếu bạn cài đặt JSON :: PP từ CPAN, bạn sẽ nhận được lệnh json_pp . Lấy cắp ví dụ từ B Bycroft bạn nhận được:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Điều đáng nói là json_ppđược cài đặt sẵn Ubuntu 12.04 (ít nhất) và Debian trong/usr/bin/json_pp


19

Tôi khuyên bạn nên sử dụng tiện ích dòng lệnh json_xs được bao gồm trong mô-đun JSON :: XS perl. JSON :: XS là một mô-đun Perl để tuần tự hóa / giải tuần tự hóa JSON, trên máy Debian hoặc Ubuntu, bạn có thể cài đặt nó như thế này:

sudo apt-get install libjson-xs-perl

Nó rõ ràng cũng có sẵn trên CPAN .

Để sử dụng nó để định dạng JSON thu được từ một URL, bạn có thể sử dụng curl hoặc wget như thế này:

$ curl -s http://page.that.serves.json.com/json/ | json_xs

hoặc này:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs

và để định dạng JSON có trong một tệp bạn có thể làm điều này:

$ json_xs < file-full-of.json

Để định dạng lại thành YAML , điều mà một số người cho là dễ đọc hơn con người so với JSON:

$ json_xs -t yaml < file-full-of.json

19

Bạn chỉ có thể sử dụng các công cụ tiêu chuẩn như jq hoặc json_pp.

echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp

hoặc là

echo '{ "foo": "lorem", "bar": "ipsum" }' | jq

cả hai sẽ làm đẹp đầu ra như sau (jq thậm chí nhiều màu sắc hơn):

{
  "foo": "lorem",
  "bar": "ipsum"
}

Ưu điểm rất lớn của jq là nó có thể làm RẤT NHIỀU hơn nếu bạn muốn phân tích và xử lý json.


json_pp đã có trên máy Mac của tôi - nhưng không phải jq. Cảm ơn!
David H

1
@DavidH - thực hiện trợ giúp này: stackoverflow.com/questions/37668134/ trên
Schmitzi

cảm ơn! Chưa bao giờ nghe nói về jq trước đây.
David H

17

jj cực nhanh, có thể xử lý các tài liệu JSON khổng lồ về mặt kinh tế, không gây rối với các số JSON hợp lệ và rất dễ sử dụng, ví dụ:

jj -p # for reading from STDIN

hoặc là

jj -p -i input.json

Nó là (2018) vẫn còn khá mới nên có thể nó sẽ không xử lý JSON không hợp lệ theo cách bạn mong đợi, nhưng rất dễ cài đặt trên các nền tảng chính.




12

Cài đặt yajl-tools bằng lệnh bên dưới:

sudo apt-get install yajl-tools

sau đó,

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat


Tuyệt vời. Không yêu cầu ngôn ngữ / thông dịch viên khác và nằm trong gói repo, không cần pha!
Joseph Lust
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.