Bash

使用 Python 解析 JSON?

  • August 20, 2018

我有一個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'

參考

https://stackoverflow.com/a/21595107/432903

如果你會使用:

$ 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 解決方案.

引用自:https://unix.stackexchange.com/questions/116228