Bash
使用 Python 解析 JSON?
我有一個
members.json
如下的 JSON 文件。{ "took": 670, "timed_out": false, "_shards": { "total": 8, "successful": 8, "failed": 0 }, "hits": { "total": 74, "max_score": 1, "hits": [ { "_index": "2000_270_0", "_type": "Medical", "_id": "02:17447847049147026174478:174159", "_score": 1, "_source": { "memberId": "0x7b93910446f91928e23e1043dfdf5bcf", "memberFirstName": "Uri", "memberMiddleName": "Prayag", "memberLastName": "Dubofsky" } }, { "_index": "2000_270_0", "_type": "Medical", "_id": "02:17447847049147026174478:174159", "_score": 1, "_source": { "memberId": "0x7b93910446f91928e23e1043dfdf5bcG", "memberFirstName": "Uri", "memberMiddleName": "Prayag", "memberLastName": "Dubofsky" } } ] } }
我想使用
bash
腳本解析它,只獲取欄位列表memberId
。預期的輸出是:
memberIds ----------- 0x7b93910446f91928e23e1043dfdf5bcf 0x7b93910446f91928e23e1043dfdf5bcG
我嘗試將以下 bash+python 程式碼添加到
.bashrc
:function getJsonVal() { if [ \( $# -ne 1 \) -o \( -t 0 \) ]; then echo "Usage: getJsonVal 'key' < /tmp/file"; echo " -- or -- "; echo " cat /tmp/input | getJsonVal 'key'"; return; fi; cat | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["'$1'"]'; }
然後呼叫:
$ cat members.json | getJsonVal "memberId"
但它拋出:
Traceback (most recent call last): File "<string>", line 1, in <module> KeyError: 'memberId'
參考
如果你會使用:
$ cat members.json | \ python -c 'import json,sys;obj=json.load(sys.stdin);print obj;'
您可以檢查嵌套字典的結構,
obj
並查看您的原始行應為:$ cat members.json | \ python -c 'import json,sys;obj=json.load(sys.stdin);print obj["hits"]["hits"][0]["_source"]["'$1'"]';
到那個“memberId”元素。這樣,您可以將 Python 保留為單行。
如果嵌套的“hits”元素中有多個元素,那麼您可以執行以下操作:
$ cat members.json | \ python -c ' import json, sys obj=json.load(sys.stdin) for y in [x["_source"]["'$1'"] for x in obj["hits"]["hits"]]: print y '
Chris Down 的解決方案更適合在任何級別找到(唯一)鍵的單個值。
在我的第二個列印出多個值的範例中,你已經達到了你應該用一個襯裡嘗試的極限,在這一點上,我看不出為什麼要在 bash 中進行一半的處理,並且會轉向一個完整的 Python 解決方案.