사람이 읽을 수있는 형식으로 JSON 형식을 지정하는 (Unix) 셸 스크립트가 있습니까?
기본적으로 다음을 변환하고 싶습니다.
{ "foo": "lorem", "bar": "ipsum" }
...이 같은 것으로 :
{
"foo": "lorem",
"bar": "ipsum"
}
json
라이브러리를,하지만 난 잘 GET 구문 강조에 관한 pygments을 추가했습니다.
사람이 읽을 수있는 형식으로 JSON 형식을 지정하는 (Unix) 셸 스크립트가 있습니까?
기본적으로 다음을 변환하고 싶습니다.
{ "foo": "lorem", "bar": "ipsum" }
...이 같은 것으로 :
{
"foo": "lorem",
"bar": "ipsum"
}
json
라이브러리를,하지만 난 잘 GET 구문 강조에 관한 pygments을 추가했습니다.
답변:
Python 2.6 이상에서는 다음을 수행 할 수 있습니다.
echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool
또는 JSON이 파일에 있으면 다음을 수행 할 수 있습니다.
python -m json.tool my_json.json
JSON이 API와 같은 인터넷 소스에서 온 경우
curl http://my_url/ | python -m json.tool
이 모든 경우에 편의를 위해 별명을 작성할 수 있습니다.
alias prettyjson='python -m json.tool'
준비를 위해 조금 더 타이핑하면 더 편리합니다.
prettyjson_s() {
echo "$1" | python -m json.tool
}
prettyjson_f() {
python -m json.tool "$1"
}
prettyjson_w() {
curl "$1" | python -m json.tool
}
위의 모든 경우에 대해. 이것을 넣을 .bashrc
수 있으며 매번 쉘에서 사용할 수 있습니다. 처럼 호출하십시오 prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.
pygmentize -l javascript
명령 줄에서 구문 색 출력을 얻기 위해 파이프로 연결할 수 있습니다. 편집 : 피그먼트가 설치된 경우입니다.
alias pretty='python -mjson.tool | pygmentize -l json
으므로 다음을 실행할 수 있습니다 command params | pretty
.. 도움이 되었기를 바랍니다. 추신 : 누구든지 이것을 확장 할 수 있다면 a) 매번보고있는 컬 출력을 제거하거나 b) json 키를 정렬하지 마십시오. 알려주세요, 나는 매우 감사합니다.
당신이 사용할 수있는: jq
사용하기 매우 간단하고 훌륭합니다! 스트림을 포함하여 매우 큰 JSON 구조를 처리 할 수 있습니다. 여기에서 해당 자습서를 찾을 수 있습니다 .
사용 예 :
$ 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"
}
. ID 필터입니다.
--sort-keys
경우에 따라 도움이되는 옵션 도 있습니다 .
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
.
<<<
내가 찾던 바로 그 운영자를 발견하게되어 매우 기쁩니다 .
JSON.stringify
JavaScript에서 JSON을 예쁘게 인쇄 하기 위해 "space"인수를 사용합니다 .
예 :
// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);
// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');
Node.js가있는 Unix 명령 행에서 명령 행에 JSON을 지정하십시오.
$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
'{"foo":"lorem","bar":"ipsum"}'
보고:
{
"foo": "lorem",
"bar": "ipsum"
}
Node.js가있는 Unix 명령 행에서 JSON이 포함 된 파일 이름을 지정하고 4 개의 공백을 들여 쓰기를 사용하십시오.
$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
.readFileSync(process.argv[1])), null, 4));" filename.json
파이프 사용 :
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));\
});\
"
node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
결과를 STDOUT으로 출력합니다.
사용 가능한 최고의 "스마트 화이트 스페이스"포맷터 중 하나가 포함 된 도구를 작성했습니다. 여기에서 다른 대부분의 옵션보다 더 읽기 쉽고 상세한 출력을 생성합니다.
"스마트 공백"은 다음과 같습니다.
약간 편견이있을 수 있지만 명령 줄에서 JSON 데이터를 인쇄하고 조작하는 훌륭한 도구입니다. 사용하기에 매우 편리하며 광범위한 명령 줄 도움말 / 문서가 있습니다. 다른 방법으로는 놀랍도록 짜증나는 1001 가지 작은 작업에 사용하는 스위스 군용 칼입니다.
최신 사용 사례 : Chrome, 개발자 콘솔, 네트워크 탭, 모두 HAR 파일로 내보내기, "cat site.har | 밑줄 select '.url'--outfmt text | grep mydomain"; 이제 회사 사이트를로드하는 동안 만들어진 모든 URL 가져 오기 목록을 시간순으로 정렬했습니다.
예쁜 인쇄가 쉽습니다.
underscore -i data.json print
같은 것:
cat data.json | underscore print
같은 것, 더 명백한 것 :
cat data.json | underscore print --outfmt pretty
이 도구는 현재의 열정적 인 프로젝트이므로 기능 요청이있는 경우이 문제를 해결할 가능성이 큽니다.
[32m
, [33m
, [39m
JSON이 유효하지 만드는, 그들 각각 전에 일부 비 인쇄와 함께. 그러나 밑줄 인쇄 만으로는 파일에 아무 것도 추가되지 않으며 서식 작업이 완벽하게 수행됩니다.
jq
하지만 이것은 큰 따옴표가없는 내 "JSON"에 효과적이었습니다.
나는 보통 그냥 :
echo '{"test":1,"test2":2}' | python -mjson.tool
그리고 선택 데이터를 검색하려면 (이 경우 "test"의 값) :
echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'
JSON 데이터가 파일에있는 경우 :
python -mjson.tool filename.json
curl
인증 토큰을 사용하여 명령 행 에서 한 번에 모두 수행하려면 다음을 수행하십시오 .
curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
| prettyjson
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))
dict
객체에는 정의 된 순서가 없습니다. 시도 json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)
하면 어쨌든 교환 된 것을 알 수 있습니다. 수정하려면 가져 오기 OrderedDict
및 load
전달하십시오 object_pairs_hook=OrderedDict
.
inputFile = sys.stdin
. 이 같은 스크립트 당신에게 파이프 물건을 할 수 있습니다 :curl http://somewhere.com/foo.json | pp_json.py
from collections import OrderedDict
.
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=(',', ': '))"
. 구분 기호는 후행 공백이 추가되지 않도록 ( ',', ':')로 설정해야합니다. bugs.python.org/issue16333
sort_keys = True
하여 json 파일을 비교하고 매력처럼 작동하기 때문에 사용했습니다.
Perl과 함께 CPAN 모듈을 사용하십시오 JSON::XS
. 명령 행 도구를 설치합니다 json_xs
.
확인:
json_xs -t null < myfile.json
JSON 파일 src.json
을 pretty.json
다음과 같이 확인하십시오.
< src.json json_xs > pretty.json
이없는 json_xs
경우을 시도하십시오 json_pp
. "pp"는 "pure perl"을위한 것입니다.이 도구는 외부 C 라이브러리 (XS가 Perl의 "확장 시스템"을 의미)에 바인딩하지 않고 Perl에서만 구현됩니다.
-t null
나에게 null을 주었습니다 : 유효한 형식이 아닙니다 ...하지만 그것을 떠나는 것은 훌륭하게 작동했습니다. 감사.
* 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에 파일 ( AnC 의 답변 뒤에 내 이름을 "prettyJSON"이라고 함)에 넣으면 chmod +x
좋습니다.
fileinput.input()
명령 행에 파일이없는 경우 FYI 는 stdin에서 읽습니다. 예
JSON Ruby Gem은 JSON을 확인하기 위해 쉘 스크립트와 함께 번들로 제공됩니다.
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
스크립트 다운로드 : gist.github.com/3738968
json.tool
. 그러나 중첩 깊이 제한 ( nesting of 20 is too deep (JSON::NestingError)
) 이있는 것 같습니다 .
sudo apt-get install ruby-json-pure
대신gem install
prettify_json.rb
있습니까?
~/bin
폴더 로 옮긴 다음 (PATH에 있는지 확인)으로 이름 prettify_json.rb
을 바꾸고 ppj
실행하십시오 chmod +x ppj
. 이제 다음과 같은 작업을 수행 할 수 있습니다curl www.jsonsring.com/something.json | ppj
업데이트jq
다른 답변에서 제안한대로 지금 사용하고 있습니다. JSON 필터링에는 매우 강력하지만 가장 기본적으로 JSON을보기 좋게 인쇄하는 멋진 방법이기도합니다.
jsonpp 는 매우 멋진 명령 행 JSON 프리티 프린터입니다.
읽어보기에서 :
다음과 같이 웹 서비스 응답을 인쇄하십시오.
curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp
디스크에서 실행되는 파일을 아름답게 만드십시오.
jsonpp data/long_malformed.json
Mac OS X를 사용하는 경우 할 수 있습니다 brew install jsonpp
. 그렇지 않은 경우 바이너리를에있는 어딘가에 복사하면 $PATH
됩니다.
python -mjson.tool
(여기에서 다른 답변 으로) 파이프로 연결 했으며 10-20 초가 걸렸습니다 ...
json_pp
-으로부터 이름의 유사성에도 불구하고, 나는 이것이 완전히 다른 프로젝트 인 생각하지만, 잘 형식 JSON을 수행하는 jsonpp
여기에 언급
그것이 내가하는 방법입니다.
curl yourUri | json_pp
코드가 단축되고 작업이 완료됩니다.
예쁜 JSON 인쇄를위한 간단한 bash 스크립트
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}'
예:
cat file.json | json_pretty.sh
%*c
표기법을 지원하지 않는 약간 다른 awk가 있으므로를 변경 printf
했습니다 c=0; while (c++<offset) printf " "; printf $0;
. 그리고 내 awk는 다른 정규식 탈출을 가지고 있으며 백 슬래시는 작동하지 않습니다 []
. 정규식을 /^[[{]/
과로 변경했습니다 /[]}]/
.
grep
실수로 지워졌습니다.)
$ 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))'
잘 읽을 수있는 단어는 \ u로 인코딩됩니다.
{
"D\u00fcsseldorf": "lorem",
"bar": "ipsum"
}
파이프 라인의 나머지 부분이 유니 코드를 정상적으로 처리하고 JSON을 인간 친화적으로 만들고 싶다면 간단히 사용하십시오. 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"
}
to_json
옵션을 허용하지 않는 것 같습니다. 그러나 이것은 작동합니다.perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
python -m json.tool
.
json.tool
코드 예제 를 보여주는 몇 가지 답변이 있습니다. 1.이 버전을 사용하면 일부 매개 변수를 변경할 수 있습니다. 예를 들어, indent
게시 당시 (2008) Python 2.4는 여전히 지원되지 않는-mjson.tool
나는 당신이 묘사하고있는 것을 정확하게하기 위해 jshon 을 사용 합니다. 그냥 실행 :
echo $COMPACTED_JSON_TEXT | jshon
JSON 데이터를 변환하기 위해 인수를 전달할 수도 있습니다.
또는 루비와 함께 :
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
to_json
메소드로 오브젝트를 직렬화하는 경우에는 작동하지 않습니다 . Kernel#jj
같은 (또는 숫자 / 문자열 / 부울)의 배열과 해시를 pretty-prints합니다.
echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Jazor를 확인하십시오 . Ruby로 작성된 간단한 명령 행 JSON 파서입니다.
gem install jazor
jazor --help
curl
이것이 나를 위해 한 유일한 명령 입니다.
JSONLint 는 GitHub에 오픈 소스 구현을 가지고 있으며 명령 줄에서 사용하거나 Node.js 프로젝트에 포함 할 수 있습니다.
npm install jsonlint -g
그리고
jsonlint -p myfile.json
또는
curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
출력을로 파이프하십시오 jq .
.
예:
twurl -H ads-api.twitter.com '.......' | jq .
cat <file_name.txt> | jq . > <output_name.txt>
brew install jq
당신이 맥 OS에 있다면.
jq .
예쁘게 인쇄 하는 데에는 한 가지 잠재적 인 단점이 있습니다. 모든 현존하는 jq 버전은 JSON 숫자를 IEEE 숫자로 취급해야하므로 매우 큰 정수와 같이 정밀도가 쉽게 손실됩니다.
cat file |
은 프로세스의 낭비입니다. 그냥 jq . <file_name.txt >output_name.txt
리터럴 <
과 >
문자로 수행하십시오.
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
jq 또는 json_pp와 같은 표준 도구를 간단히 사용할 수 있습니다.
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
또는
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
둘 다 다음과 같이 출력을 prettify합니다 (jq 훨씬 더 화려한).
{
"foo": "lorem",
"bar": "ipsum"
}
jq의 큰 장점은 json을 구문 분석하고 처리하려면 더 많이 할 수 있다는 것입니다.
bat
이다 cat
구문 강조 표시 복제본입니다.
예:
echo '{"bignum":1e1000}' | bat -p -l json
-p
헤더없이 출력 -l
되며 언어를 명시 적으로 지정합니다.
JSON의 색상과 형식이 있으며이 주석에 언급 된 문제 가 없습니다 : 쉘 스크립트에서 JSON을 어떻게 예쁜 인쇄 할 수 있습니까?
아래 명령으로 yajl-tools를 설치하십시오 :
sudo apt-get install yajl-tools
그때,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat