<p>httpie 좜λ ₯μ—μ„œ ​​json ν•„λ“œ μˆœμ„œ λ³€κ²½</p>

에 λ§Œλ“  2016λ…„ 01μ›” 14일  Β·  27μ½”λ©˜νŠΈ  Β·  좜처: httpie/httpie

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 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 문제λ₯Ό μΆ”μ ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” 것이 νŽΈμ•ˆν•˜λ‹€λŠ” 것을 μΈμ •ν•˜λŠ” 것보닀 훨씬 더 λ§Žμ€ μ‹œκ°„μ„ μžƒμ—ˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ 물건을 λ‹€μ‹œ μ£Όλ¬Έν•  수 μžˆλ‹€λŠ” 생각쑰차 ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

JSON을 μž¬μ •λ ¬ν•˜λŠ” μ˜΅μ…˜μ„ κ°–λŠ” 것이 κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆκΉŒ? 90%의 μ‹œκ°„μ€ μ„œλ²„ 좜λ ₯을 κ°œμ„ ν•˜κΈ°λ³΄λ‹€λŠ” λ‚œλ…ν™”ν•  κ²ƒμž…λ‹ˆλ‹€.

ν’€ λ¦¬ν€˜μŠ€νŠΈλ₯Ό μ œμΆœν•˜κ³  μ‹Άμ§€λ§Œ ν•˜λ‚˜μ˜ νŒŒμΌμ—μ„œ "True"λ₯Ό "False"둜 λ³€κ²½ν•˜λŠ” κ²ƒλΏμž…λ‹ˆλ‹€.

λͺ¨λ“  27 λŒ“κΈ€

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

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰