ヒトリ歩き

愚痴とかいろいろ書きます

curlコマンドの結果を整形する

curlREST APIを実行してレスポンスが返却された際に、データが多いと1行で表示されるので、非常に見にくい。
そんな時には、python -m json.tool を使うとJSONを整形してくれる。

pythonなし

curl -X GET http://api.thni.net/jzip/X0401/JSON/064/0941.js
{ "state":"1", "stateName":"北海道", "city":"札幌市中央区", "street":"旭ケ丘" }

pythonあり

curl -s -X GET http://api.thni.net/jzip/X0401/JSON/064/0941.js | python -m json.tool
{
    "state": "1",
    "stateName": "\u5317\u6d77\u9053",
    "city": "\u672d\u5e4c\u5e02\u4e2d\u592e\u533a",
    "street": "\u65ed\u30b1\u4e18"
}

日本語がエスケープされる

このままだと日本語が含まれる場合はエスケープされて表示されてしまう。
下記の記事を参考にjson.dumpsを使えばエスケープされずに表示される。
ただし、CentOSだとUnicodeEncodeError: 'ascii' codec can't encode characters in position 15-20: ordinal not in range(128)のエラーが出ており、うまく表示されない。
原因までは調べていないので、今度調べてみようと思う。

qiita.com

curl -s http://api.thni.net/jzip/X0401/JSON/064/0941.js | python -c 'import sys,json;print json.dumps(json.loads(sys.stdin.read()),indent=4,ensure_ascii=False)'
{
    "city": "札幌市中央区", 
    "state": "1", 
    "stateName": "北海道", 
    "street": "旭ケ丘"
}

python3と構文修正で対応できた (2021/1/17 更新)

riceflow (id:yoneyore)さんからのコメントを頂き、値が取得できた。 コメントありがとうございました!

python3とprint関数をカッコ()で括れば正常に動作した。 詳細な原因は分からないが、値は取得できた。

curl -s http://api.thni.net/jzip/X0401/JSON/064/0941.js | python3 -c 'import sys,json;print(json.dumps(json.loads(sys.stdin.read()),indent=4,ensure_ascii=False))'
{
    "state": "1",
    "stateName": "北海道",
    "city": "札幌市中央区",
    "street": "旭ケ丘"
}

最後に

REST APIの試験をするとなるとこのような整形が地味に効いてくる。
確認ミスをなくすには整形して見やすい形にすることは重要。

参考

project.iw3.org