httpieκ° json νλ μμλ₯Ό λ³κ²½νμ§ μλλ‘ νλ €λ©΄ μ΄λ»κ² ν΄μΌ νλμ§ κΆκΈνμλκΉ?
curl -i http://localhost:8080/v1/notes/569766aed4c661fba8d85a12
{
"id": "569766aed4c661fba8d85a12",
"content": "hi"
}
httpieμ ν¨κ»
http get :8080/v1/notes/569766aed4c661fba8d85a12
{
"content": "hi",
"id": "569766aed4c661fba8d85a12"
}
id
νλκ° νμ 첫 λ²μ§Έ νλμΈ κ²μ μ νΈν©λλ€. μ΄κ²¬μλ μ¬λ?
json ν¬λ§·ν°μμ sort_keys=True
μ΄κ²μ΄ μ΄μ μΌ κ²μ΄λΌκ³ μΆμΈ‘ν μ μλ€.
μκ² μ΅λλ€. κ°μ¬ν©λλ€.
λ€μμ μ¬μ©νμ¬ ν€ μ λ ¬μ λΉνμ±νν μ μμ΅λλ€(λΆννλ λ€μ¬μ°κΈ°μ ν¨κ» μ¬μ©νμ§λ§ κ·Έλ κ² ν° λ¬Έμ λ μλλλ€)
http --pretty=colors get :8080/v1/notes/569766aed4c661fba8d85a12
νμν©λλ€. μ λ ¬μ΄ μΌλ°μ μΌλ‘ μνλμ΄μΌ νλ κ²μΈμ§ μλλ©΄ μλ²κ° μλν λλ‘ μνλμ΄μΌ νλμ§μ λν μ§λ¬Έμ μ κΈ°νλ€κ³ μκ°ν©λλ€.
μλ΅μμ ν€λ₯Ό μ λ ¬νμ§ μκ³ μμκ³Ό μμμ νμ©νκΈ° μν΄ --pretty
μ λ€λ₯Έ κ°μ λμ
ν μ μμ΅λκΉ?
κΈ°λ³ΈμΌλ‘ 무μμΌλ‘ λ§λ€ μ μμ΅λκΉ? μ λ ¬ ν€ λμμ μνλ μ¬λλ€μ μν --sort-keys
μ κ°μ μ΅μ
; https://bugs.python.org/issue21650 μ°Έμ‘° json.toolμλ μ΄λ―Έ python3μ μ΅μ
μ΄ μμ΅λλ€.
βΈ python3 -m json.tool -h
usage: python -m json.tool [-h] [--sort-keys] [infile] [outfile]
A simple command line interface for json module to validate and pretty-print
JSON objects.
positional arguments:
infile a JSON file to be validated or pretty-printed
outfile write the output of infile to outfile
optional arguments:
-h, --help show this help message and exit
--sort-keys sort the output of dictionaries alphabetically by key
λ°μ΄ν°λ₯Ό μλͺ»λ μμλ‘ λ³΄λ΄λ μ΄μ λ₯Ό μμλΌ μ μμκΈ° λλ¬Έμ μλ² μΈ‘ JSON λΌμ΄λΈλ¬λ¦¬μμ λ¬Έμ λ₯Ό μΆμ νλ €κ³ μλνλ κ²μ΄ νΈμνλ€λ κ²μ μΈμ νλ κ²λ³΄λ€ ν¨μ¬ λ λ§μ μκ°μ μμμ΅λλ€. ν΄λΌμ΄μΈνΈκ° 물건μ λ€μ μ£Όλ¬Έν μ μλ€λ μκ°μ‘°μ°¨ νμ§ λͺ»νμ΅λλ€.
JSONμ μ¬μ λ ¬νλ μ΅μ μ κ°λ κ²μ΄ κ°μΉκ° μμ΅λκΉ? 90%μ μκ°μ μλ² μΆλ ₯μ κ°μ ν기보λ€λ λλ νν κ²μ λλ€.
ν 리νμ€νΈλ₯Ό μ μΆνκ³ μΆμ§λ§ νλμ νμΌμμ "True"λ₯Ό "False"λ‘ λ³κ²½νλ κ²λΏμ
λλ€.
@carlfish μ μ μ μΌλ‘ λμν©λλ€.
@jkbrzt μ΄μ λν μκ°μ΄ μμ΅λκΉ?
μ΄κ²μ λ‘컬μμ ν μ€νΈνλλ° ν¬λ§·ν°μκ² μνλ²³μμΌλ‘ μ λ ¬νμ§ λ§λΌκ³ λ§νλ©΄ λμ μμμ μμλ‘ κ°μ²΄ ν€λ₯Ό κ°μ Έμ€λ κ²μ²λΌ 보μ λλ€. μ΄ κ²½μ° μνλ²³μμ΄ λ¬΄μμλ³΄λ€ λ λμ μ μμ΅λλ€.
μ λ ¬λμ§ μμ μ¬μ μ΄ λ·λ°μΉ¨νλ κ² κ°μλ°μ?
μ, python json.loads
λ κΈ°λ³Έμ μΌλ‘ μ¬μ μ λ‘λλ©λλ€. μ΄λ μμΈ‘ν μ μλ μμ(λ€μ λ΄λΆμ μΌλ‘ μ¬μ©λλ ν΄μ μ½λ)μ΄λ©° μνλ²³ μμλ³΄λ€ μ’μ§ μμ΅λλ€.
νμ§λ§ ν΄κ²° λ°©λ²μ΄ μμ΅λλ€ object_pairs_hook=OrderedDict
; json.dumps
νΈμΆ μ sort_keys
λλ‘
>>> import json
>>> from collections import OrderedDict
>>> data = json.loads('{"foo":1, "bar": 2}', object_pairs_hook=OrderedDict)
>>> print json.dumps(data, indent=4)
{
"foo": 1,
"bar": 2
}
>>>
λμ€μ λ©΄λν μΌν¬ 2λ§λ¦¬: pull request -> https://github.com/jkbrzt/httpie/pull/520
κ·Έλ§ν κ°μΉκ° μκΈ° λλ¬Έμ μ λ JSON μΆλ ₯μ ν€λ₯Ό μ λ ¬νλ κ²μ μ’μνλ μ¬μ©μμ λλ€. λ΄ μλ²λ ν€λ₯Ό μΆλ ₯νλ μμλ₯Ό μ μνμ§ μμΌλ©° μμν ν€κ° JSON λ³Έλ¬Έμ ν¬ν¨λμλμ§ μ¬λΆλ₯Ό νμΈνλ €λ κ²½μ° μ λ ¬ν λ ν¨μ¬ μ½μ΅λλ€. λ°λΌμ μ λ ¬ κΈ°λ₯μ μμλ‘ μ κ±°νμ§ λ§κ³ νλκ·Έλ₯Ό ν΅ν΄ ꡬμ±νκ±°λ ν κΈν μ μλλ‘ νλ κ²μ΄ μ’μ΅λλ€.
ping μμ±μ @jakubroztocil μ΄ μ μ§ λ³΄μκ° μ€λ¨ λμμ΅λκΉ?
μ΄ λ¬Έμ μ λν 견μΈλ ₯μ΄ μμ΅λκΉ? @carlfish μ λ§μ°¬κ°μ§λ‘ μ λ μ°½νΌν μ λλ‘ μ€λ μκ°μ λ΄ μλ²μ λ²κ·Έλ₯Ό μμ νλ λ° μκ°μ 보λμ§λ§ httpieκ° λ¬Έμ λΌλ κ²μ λ°κ²¬νμ΅λλ€.
μ¬μ©μκ° λͺ μμ μΌλ‘ νμ±ννμ§ μκ³ μλ²μμ λ°μ΄ν°λ₯Ό μ¬μ λ ¬/μ λ ¬νλ€λ κ²μ λ§€μ° μ§κ΄μ μ΄μ§ μμ κ² κ°μ΅λλ€.
λΆννλ μμ§ λ³ν©λμ§ μμ μ루μ μ΄ PR #520μ μμ΅λλ€.
μ΄κ²μ μ λ§ μ μ©ν κ²μ λλ€. μ λ ¬μ μνμ§ μμ λ μ’μ§ μμ΅λλ€.
μ 체 Python2λ λ μ΄μ μ¬μ©λμ§ μμ΅λλ€. μΌλΆ μ μ§ κ΄λ¦¬μκ° λ³΄λ₯ μ€μΈ PRμ μ΄ν΄λ³Ό μ μμ΅λκΉ? κΈ°κ³ μ κ·Έλνμμ @jakubroztocil @msabramo κ° μ¬μ ν νμ± μνμΈ κ² κ°μ΅λκΉ?
μ΄ μμ μ νλ μ¬λμ΄ μμ΅λκΉ? μ΄ λ¬Έμ κ° ν΄κ²°λ κ²μΌλ‘ κΈ°λν μ μμ΅λκΉ?
@opensas λ κ·Έκ²μ λν΄ μμ§ λͺ»νμ§λ§ κ°λ₯ν ν΄κ²°μ±
μ jq
λꡬλ₯Ό μ¬μ©νλ κ²μ
λλ€.
http https://jsonplaceholder.typicode.com/todos/1 | jq -C
@opensas μ΄ κΈ°λ₯μ ν₯ν v2.2.0μ ν¬ν¨λ μμ μ λλ€.
κ°λ₯ν ν΄κ²°μ± μ
jq
λꡬλ₯Ό μ¬μ©νλ κ²μ λλ€.http https://jsonplaceholder.typicode.com/todos/1 | jq -C
@nmtitov μ¬κΈ°μμ μμλ₯Ό 볡μνλ κ²μ μ€μ λ‘ jq
κ° μλλΌ μμκ³Ό νμ μ λλ μΆλ ₯μ 리λλ μ
νλ νμμ
λλ€(ν¨κ³Όμ μΌλ‘ --pretty=none
μ€μ ).
νμ μ£Όμ
μ κ°μ¬ν©λλ€. μ΄λ―Έ μ΄ μ€λ λμμ μμμ°¨λ Έμ΅λλ€.
jqλ₯Ό ν΅ν΄ νμ΄νν ν λλ¨Έμ§ μμ² μ 보(μν λ° ν€λ)λ₯Ό μ μ§ν μ μλ λ°©λ²μ΄ μμ΅λκΉ?
λ΄ λ§μ, httpieλ λ€μμ λ°νν©λλ€.
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 109
Content-Type: application/json; charset=utf-8
Date: Sat, 25 Apr 2020 11:14:32 GMT
ETag: W/"6d-wWZh31xOzPgYyzU23ihgZaW8KkI"
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Content-Type-Options: nosniff
X-DNS-Prefetch-Control: off
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
[
{
"id": 1,
"text": "Read the docs"
},
{
"id": 2,
"text": "Create my first application"
},
{
"id": 3,
"text": "Write tests"
}
]
νμ§λ§ http | jq -Cλ 첫 λ²μ§Έ λΆλΆμ μ κ±°νκ³ λ€μλ§ λ°νν©λλ€.
[
{
"id": 1,
"text": "Read the docs"
},
{
"id": 2,
"text": "Create my first application"
},
{
"id": 3,
"text": "Write tests"
}
]
@opensas μ¬μ©μ μ μ bash λνΌλ₯Ό μμ±νμ§ μλ ν κ°λ₯νμ§ μλ€κ³ μκ°ν©λλ€.
@opensas @nmtitov μΆλ ₯μ νμ΄ννλ©΄ κΈ°λ³Έ --print=hb
(λ¨Έλ¦¬κΈ λ° λ³Έλ¬Έ μΈμ)λ₯Ό --print=b
λ‘ λ³κ²½νλ λΆμμ©μ΄ μμ΅λλ€(μΆλ ₯μ 리λλ μ
ν λ μΌλ°μ μΌλ‘ μνλ κ²μ΄κΈ° λλ¬Έμ λ³Έλ¬Έλ§ μΈμν©λλ€. ). --print=hb
μ ν€λλ₯Ό ν¬ν¨νλλ‘ λͺ
μμ μΌλ‘ μμ²ν μ μμ΅λλ€.
https://httpie.org/docs#output -μ΅μ
@jakubroztocil μ΄κ²μ jq
κ° JSON λ³Έλ¬Έμ μ
λ ₯μΌλ‘ μμνκΈ° λλ¬Έμ μλνμ§ μμ΅λλ€.
$ http --print=hb https://jsonplaceholder.typicode.com/todos/1 | jq -C
parse error: Invalid numeric literal at line 1, column 9
λ΄κ° μ°Έμ‘°. http --download httpbin.org/get | jq
λ₯Ό μ¬μ©ν μ μμ΅λλ€.
httpieλ₯Ό μ¬μ©νλ λμ λ€μ workqroundλ₯Ό μ°Ύμμ΅λλ€. λλ curlie λ₯Ό μ°Ύμμ΅λλ€.
curlκ³Ό λΉμ·νμ§λ§ httpieμ λ¬λ¦¬ ν€λλ stdout λμ stderrμ μμ±λ©λλ€.
κ·Έλμ λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
$ curlie GET localhost:3000/tasks | jq -C
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 304
ETag: W/"130-ED1W4hQo1i7na7wy5Ewc7iKdoJc"
Date: Wed, 27 May 2020 06:28:26 GMT
Connection: keep-alive
[
{
"id": 2,
"title": "new task2",
"description": "description2",
"status": "OPEN"
},
{
"id": 3,
"title": "new task3",
"description": "description3",
"status": "OPEN"
}
]
httpieμ λ§μ°¬κ°μ§λ‘ ν€λλ
BTW, λλμ΄ νΈλ¦¬ν μ€ν¬λ¦½νΈλ₯Ό λ§λ€μμ΅λλ€.
$ cat ~/bin/c
curlie "$@" | jq -C
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ v2.2.0μ΄ λ°©κΈ μΆμλμμ΅λλ€. μ¬κΈ°μμ μλ‘μ΄ --unsorted
, --sorted
λ° --format-options
μ λν΄ μμ보μΈμ.
https://httpie.org/docs#colors -and-formatting
κ°μ₯ μ μ©ν λκΈ
λ°μ΄ν°λ₯Ό μλͺ»λ μμλ‘ λ³΄λ΄λ μ΄μ λ₯Ό μμλΌ μ μμκΈ° λλ¬Έμ μλ² μΈ‘ JSON λΌμ΄λΈλ¬λ¦¬μμ λ¬Έμ λ₯Ό μΆμ νλ €κ³ μλνλ κ²μ΄ νΈμνλ€λ κ²μ μΈμ νλ κ²λ³΄λ€ ν¨μ¬ λ λ§μ μκ°μ μμμ΅λλ€. ν΄λΌμ΄μΈνΈκ° 물건μ λ€μ μ£Όλ¬Έν μ μλ€λ μκ°μ‘°μ°¨ νμ§ λͺ»νμ΅λλ€.
JSONμ μ¬μ λ ¬νλ μ΅μ μ κ°λ κ²μ΄ κ°μΉκ° μμ΅λκΉ? 90%μ μκ°μ μλ² μΆλ ₯μ κ°μ ν기보λ€λ λλ νν κ²μ λλ€.
ν 리νμ€νΈλ₯Ό μ μΆνκ³ μΆμ§λ§ νλμ νμΌμμ "True"λ₯Ό "False"λ‘ λ³κ²½νλ κ²λΏμ λλ€.