2.6k

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"
}
|
4.0k

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"}'.

|
  • 1

    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.

    – Hoàng Khởi Phong 03:24:14 03/12/2011
  • 1

    Một câu trả lời tuyệt vời, chỉ thận trọng 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.

    – Dương Khắc Hiếu 20:35:46 26/06/2012
  • 1

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

    – Tạ Thất Dũng 06:59:28 15/10/2012
  • 1

    Đ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ương Quốc Khánh 11:24:05 16/10/2012
  • 1

    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.

    – Dương Nhã Hồng 17:42:53 25/02/2015
787

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 .

Đây là một ví dụ:

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

Hay nói cách khác:

$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
  "bar": "ipsum",
  "foo": "lorem"
}
|
  • 1

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

    – Huỳnh Minh Ðạt 01:17:09 04/11/2014
  • 1

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

    – Tạ Xuân Ngọc 07:44:09 21/04/2015
  • 1

    Câu trả lời này gây nhầm lẫn vì toán tử <<< tối nghĩa . Tại sao không chỉ sử dụng echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .cho ví dụ?

    – Bùi Vương Triều 17:26:51 26/08/2015
  • 1

    "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 các 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.

    – Lý Anh Vũ 02:38:52 04/09/2015
  • 1

    @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.

    – Ngô Phi Phi 20:10:36 28/12/2016
366

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));\
 });\
"
|
328

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 dễ đọc hơn và ít hơn so với 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 thực hiện 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ìm nạp 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.

|
  • 1

    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

    – Huỳnh Minh Ðạt 18:42:14 20/11/2013
  • 1

    Cảm ơn Dave! Công cụ là tốt! alias beautiful-json = "underrsore beautiful" và sản lượng curl làm hài lòng một mắt

    – Tạ Xuân Ngọc 09:44:21 20/01/2015
  • 1

    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 . nhấn 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.

    – Bùi Vương Triều 12:18:57 24/01/2015
  • 1

    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.

    – Lý Anh Vũ 00:37:21 27/02/2015
  • 1

    @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 ...

    – Ngô Phi Phi 02:37:14 14/05/2015
171

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
|
85

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))
|
  • 1

    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.

    – Đặng Yến Trang 02:58:30 31/05/2013
  • 1

    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 các nội dung theo kịch bản như sau:curl http://somewhere.com/foo.json | pp_json.py

    – Hồ Gia Khanh 18:37:18 31/10/2014
  • 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.

    – Hồ Phương Nam 09:30:21 22/09/2015
  • 1

    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

    – Vũ Quang Khải 17:05:27 13/06/2016
  • 1

    Đ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ê.

    – Trịnh Minh Điệp 20:40:19 25/01/2017
70

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
|
68

Với Perl, sử dụng mô-đun CPAN JSON::XS. Nó cài đặt một công cụ dòng lệnh json_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).

|
67

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 .
|
  • 1

    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.

    – Tạ Bạch Mai 07:23:37 20/10/2017
  • 1

    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)

    – Tạ Khoa Đạt 07:33:36 01/12/2017
67

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.

|
64

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

|
  • 1

    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)).

    – Tạ Bạch Mai 06:40:04 30/05/2011
  • 1

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

    – Tạ Khoa Đạt 17:45:40 27/03/2012
  • 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

    – Ngô Khiết Linh 18:05:27 31/05/2012
  • 1

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

    – Đặng Bích Trang 16:56:54 23/08/2012
  • 1

    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

    – Dương Yến Nhi 14:39:08 02/10/2012
53

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 ...

    – Tạ Bạch Mai 19:27:19 28/04/2015
  • 1

    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.

    – Tạ Khoa Đạt 21:43:07 28/04/2015
  • 1

    Trên hộp ubfox của tôi, tôi có một json_ppđịnh dạng độ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

    – Ngô Khiết Linh 11:24:14 29/07/2016
51

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

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.

|
46

Đó 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.

|
41
$ 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"
}
|
  • 1

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

    – Ngô Hoàn Châu 08:55:14 09/12/2008
  • 1

    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

    – Lê Phương Tâm 15:12:39 16/12/2011
  • 1

    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.

    – Ngô Ngọc Hải 02:28:17 17/03/2014
  • 1

    @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

    – Thùy Thùy 07:21:48 17/03/2014

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.