unix (유닉스) 쉘 스크립트로 JSON을 어떻게 출력 할 수 있습니까?





15 Answers

다음을 사용할 수 있습니다 : jq

사용하기가 매우 쉽고 훌륭하게 작동합니다! 스트림을 포함하여 매우 큰 JSON 구조를 처리 할 수 ​​있습니다. here 에서 자습서를 찾을 수 있습니다.

다음은 그 예입니다.

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

또는 다른 말로하면 :

$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
  "bar": "ipsum",
  "foo": "lorem"
}
json unix command-line format pretty-print

사람이 읽을 수있는 형태로 JSON을 포맷팅하기위한 (유닉스) 셸 스크립트가 있습니까?

기본적으로, 나는 다음과 같이 변형시키고 싶다.

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

... 이런 식으로 :

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



내가 사용할 수있는 최고의 "스마트 공백"포맷터 중 하나를 가진 도구를 썼습니다. 여기서 다른 옵션의 대부분보다 더 읽기 쉽고 덜 자세한 출력을 생성합니다.

underscore-cli

이것은 "스마트 공백"이 어떻게 생겼는지입니다.

조금 편견이있을 수 있지만 명령 줄에서 JSON 데이터를 인쇄하고 조작하는 데 유용한 도구입니다. 사용하기 매우 편리하며 광범위한 명령 줄 도움말 / 문서가 있습니다. 놀랍게도 다른 방법으로는 성가신 1001 개의 작은 작업에 사용하는 스위스 군용 칼입니다.

최신 유즈 케이스 : Chrome, 개발자 콘솔, 네트워크 탭, 모두 HAR 파일로 내보내기, "cat site.har | underscore select '.url'--outfmt text | grep mydomain"; 이제 회사 회사 사이트를로드하는 동안 만들어진 모든 URL 가져 오기 목록을 시간순으로 나열했습니다.

예쁜 인쇄는 쉽습니다.

underscore -i data.json print

같은 것:

cat data.json | underscore print

똑같은, 더 명백한 :

cat data.json | underscore print --outfmt pretty

이 도구는 현재 나의 열정적 인 프로젝트이므로, 기능 요청이있을 경우이를 해결할 수있는 좋은 기회가됩니다.




JF Sebastian의 매우 유용한 포인터 덕분에 다음과 같이 약간 개선 된 스크립트가 제공됩니다.

#!/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))



* nix에서 stdin을 읽고 stdout에 쓰는 것이 더 효과적입니다.

#!/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)

이 파일을 PATH 및 chmod +x 있는 AnC 의 답변 (내 이름은 "prettyJSON"이라고 함)에 넣으면됩니다.




JSON Ruby Gem에는 JSON을 가장 잘 나타내는 쉘 스크립트가 번들로 제공됩니다.

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

스크립트 다운로드 : gist.github.com/3738968




업데이트 다른 답변에서 제안 된대로 jq 사용하고 있습니다. JSON을 필터링 할 때 매우 강력하지만, 가장 기본적인 것은 JSON을보기 좋게 인쇄하는 멋진 방법입니다.

jsonpp 은 JSON 꽤 좋은 명령 행이다.

README에서 :

웹 서비스 응답을 다음과 같이 인쇄하십시오.

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

디스크에있는 파일을 아름답게 꾸미십시오.

jsonpp data/long_malformed.json

Mac OS X을 사용하고 있다면 brew install jsonpp 수 있습니다. 그렇지 않다면 바이너리를 $PATH 어딘가에 복사하면됩니다.




$ 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"
}

참고 :이 방법은 아닙니다.

Perl과 동일합니다.

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

참고 2 : 실행하면

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

멋지게 읽을 수있는 단어가 인코딩됩니다.

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

나머지 파이프 라인이 정상적으로 유니 코드를 처리하고 JSON을 사람이 쉽게 use ensure_ascii=False 단순히 ensure_ascii=Falseuse 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)'

그리고 당신은 얻을 것이다 :

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



Jazor 확인하십시오. Ruby로 작성된 간단한 명령 행 JSON 구문 분석기입니다.

gem install jazor
jazor --help



또는 루비와 함께 :

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



JSONLint 는 명령 행 에서 github 을 사용하거나 node.js 프로젝트에 사용할 수있는 github오픈 소스 구현을 제공 합니다.

npm install jsonlint -g

그리고

jsonlint -p myfile.json

또는

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less



바닐라 배쉬

타사 설치없이 예쁜 JSON 인쇄를위한 간단한 Bash 스크립트 ( grep / awk )

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

예 :

1) 콘솔에서 파일 읽기 및 예쁜 인쇄

cat file.json | json_pretty.sh

2) 파일에서 파일 (UTF8 기반)의 창 GIT Bash와 함께 사용 :

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json



JSON :: XS perl 모듈에 포함 된 json_xs 명령 줄 유틸리티를 사용하는 것이 좋습니다. JSON :: XS는 데비안 또는 우분투 컴퓨터에서 JSON을 직렬화 / 비 직렬화하는 Perl 모듈로서 다음과 같이 설치할 수 있습니다.

sudo apt-get install libjson-xs-perl

CPAN 에서도 사용할 수 있습니다.

이 URL을 사용하여 JSON을 포맷하려면 다음과 같이 curl 또는 wget을 사용할 수 있습니다.

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

아니면 이거:

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

파일에 포함 된 JSON을 포맷하려면 다음을 수행하십시오.

$ json_xs < file-full-of.json

어떤 사람들은 JSON보다 인간이 읽을 수있는 것으로 생각하는 YAML 다시 포맷하려면 :

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



아래 명령을 사용하여 yajl-tools를 설치하십시오 :

sudo apt-get install yajl-tools

그때,

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




yajl 은 제 경험으로 아주 좋습니다. json_reformat 명령을 사용하여 .vimrc 다음 행을 넣어서 vim 에서 .json 파일을 예쁜 것으로 인쇄합니다.

autocmd FileType json setlocal equalprg=json_reformat



나는 httpie 사용 httpie

$ pip install httpie

그리고 당신은 이것을 다음과 같이 사용할 수 있습니다.

 $ http PUT localhost:8001/api/v1/ports/my 
 HTTP/1.1 200 OK
 Connection: keep-alive
 Content-Length: 93
 Content-Type: application/json
 Date: Fri, 06 Mar 2015 02:46:41 GMT
 Server: nginx/1.4.6 (Ubuntu)
 X-Powered-By: HHVM/3.5.1

 {
     "data": [], 
     "message": "Failed to manage ports in 'my'. Request body is empty", 
     "success": false
 }



Related