2016-10-02 20 views
0

我想檢索投票給定一個特定的ID,數據(恭維到​​)存儲在json中,我在Python中編寫並打算使用js基於一個嵌套值在Json中檢索值

例如輸入 「Y000062」 應產生 「贊成」

{ 
    "bill": { 
    "congress": 114, 
    "type": "hr" 
    }, 
    "category": "passage", 
    "votes": { 
    "Aye": [ 
     { 
     "display_name": "Abraham", 
     "id": "A000374", 
     }, 
     { 
     "display_name": "Yarmuth", 
     "id": "Y000062", 
     } 
    ], 
    "Nay": [ 
     { 
     "display_name": "Clyburn", 
    "id": "C000537", 
     }, 
    ]}} 

在終端中的溶液是貓/ccc/114/votes/2015/H384/data.json | egrep'Nay | Not Voting | Present | Yea | Aye | Y000062'| grep -B 1'Y000062'|頭-1 但中繼到python子進程看起來像一個笨重的解決方案。

注意到:以JSON {}是一個對象,[]是一個數組

回答

0

下面是示例函數來實現這一點:

def get_vote_cast_from_id(id): 
    global my_json 
    for name, nested_values in my_json['votes'].items(): 
     if any(nested_value['id'] == id for nested_value in nested_values): 
      return name 
    else: 
     return None 

get_vote_cast_from_id("A000374") 
# returns: "Aye" 

get_vote_cast_from_id("random_id") 
# returns: None 

其中my_json是全局變量存儲你JSON目的。

0
>>> d = { 
... "bill": { 
...  "congress": 114, 
...  "type": "hr" 
... }, 
... "category": "passage", 
... "votes": { 
...  "Aye": [ 
...  { 
...   "display_name": "Abraham", 
...   "id": "A000374", 
...  }, 
...  { 
...   "display_name": "Yarmuth", 
...   "id": "Y000062", 
...  } 
...  ], 
...  "Nay": [ 
...  { 
...   "display_name": "Clyburn", 
...  "id": "C000537", 
...  }, 
...  ]}} 
>>> 
>>> # store lookup value in variable to more easily change later 
... lookup_value = 'Y000062' 
>>> 
>>> # you're only concerned with the data in d['votes'] 
... for key, value in d['votes'].items(): 
...  # for each 'display_name' in the each vote type ('Aye' or 'Nay') 
...  for element in value: 
...   if element['id'] == lookup_value: 
...    print(key) 
... 
Aye 
>>> 
0

這裏有三個解決方案使用jq。如果一個人只能投票一次,那麼結果應該是一樣的;否則,它們可能會有所不同,例如,如果某個人被記錄爲投票Aye和Nay。

第一種解決方案假定每個人最多投票一次。如果這個假設成立,那麼它也是最有效的,因爲它使用any/2,其中有「短路」的語義:

$ jq --arg id Y000062 '.votes 
| if any(.Aye[]; select(.id == $id)) then "Aye" 
elif any(.Nay[]; select(.id == $id)) then "Nay" 
else "none" 
end' votes.json 

下一個解決方案的報告「贊成」關於贊成者個人的每次出現列表,只有繼續爲該院名單也這樣做,如果被發現的贊成者名單上沒有出現:如果有多少次一個人可以在出現任何約束

$ jq --arg id Y000062 '.votes 
| ((.Aye[] | select(.id == $id) | "Aye") // 
    (.Nay[] | select(.id == $id) | "Nay")) ' votes.json 

第三種解決方案可能是適當的兩個列表。它首先構造[VOTE,ID]對一個流,然後選擇感興趣的ID:

$ jq --arg id Y000062 '.votes 
| ((.Nay[] | ["Nay", .id]), 
    (.Aye[] | ["Aye", .id]))) 
| select(.[1] == $id) 
| .[0]' votes.json 

在給定的輸入(輕微改變以使其有效的JSON),所有三種溶液的輸出爲:

"Aye" 

(您可以使用命令行工具,如hjson的JSON-與-額外逗號JSON轉換。)

0

下面是使用tostream

一個JQ解決方案
.votes 
| tostream 
| select(length==2) as [$p,$v] 
| select($v == $id) 
| $p[0] 

如果該濾波器是在filter.jq和樣本數據是在data.json然後

jq -M --arg id Y000062 -f filter.jq data.json 

產生

"Aye"