2017-02-07 4 views
0

я скачиваю некоторые JSON из URL:Как я могу получить доступ к значениям в этом JSON?

from urllib.request import Request, urlopen 
import json 

url = 'xyz' 
r = Request(url, headers={'User-Agent':'Mozilla/5.0'}) 
weburl = urlopen(r) 
dat = weburl.read() 
encoding = weburl.info().get_content_charset('utf-8') 
j = json.loads(data.decode(encoding)) 
print(j) 

Это создает что-то вроде:

{ 
    "foo":123, 
    "bar":4, 
    "c640103":[5,"xyz", 85.6 ... ], 
    "c63f456":[8,"pyz", 45.6 ... ], 
    "c63fdfd":[2,"xhk", 42.8 ... ], 
    "c64088a":[9,"vyi", 61.1 ... ], 
    "c63eb0c":[1,"xeq", 25.4 ... ] 
} 

Как можно видеть, ключи после bar немного ... странно. Я понятия не имею, чтобы знать заранее, кем они являются или могут быть.

Как я могу получить foo как переменную, а затем получить bar как переменную, а затем получить каждый из этих выигрышных ключей и их массив?

Я хочу, чтобы получить что-то вроде этого:

foo = j['foo'] 
bar = j['bar'] 
wonky_keys = j['wonky_keys'] 
for i in wonky_keys: 
    print(i[0]) //5 
    print(i[1]) //xyz 
    ... 
+3

'j' - это словарь. Вы можете зациклиться на 'j.items()' –

+0

@ cricket_007 Спасибо, это то, что мне нужно ... но я новичок в python, поэтому даже не был уверен, как его использовать! – pookie

ответ

0

Вы можете запустить через объект JSON, когда экземпляр значения является список, чем пробежать элементов списка, если это не список, чем просто напечатать простое значение.

js = { 
    "foo":123, 
    "bar":4, 
    "c640103":[5,"xyz", 85.6 ], 
    "c63f456":[8,"pyz", 45.6 ], 
    "c63fdfd":[2,"xhk", 42.8 ], 
    "c64088a":[9,"vyi", 61.1], 
    "c63eb0c":[1,"xeq", 25.4] 
} 

for elem in js: 
    if isinstance(js[elem], list): 
    for elem_li_item in js[elem]: 
     print (elem_li_item) 
    else: 
    print (js[elem]) 

Вы можете сделать это с js.items(), а также:

for k,v in js.items(): 
    if isinstance(v, list): 
    for elem_li_item in v: 
     print (elem_li_item) 
    else: 
    print (v) 

isinstance (объект, classinfo)

возвращает истину, если объект аргумент является экземпляром аргумента classinfo , или (прямого, косвенного или виртуального) подкласса. Также возвращает true, если classinfo - это объект типа (класс нового стиля), а объект - это объект этого типа или (прямой, косвенный или виртуальный) подкласс. Если объект не является экземпляром класса или объектом данного типа, функция всегда возвращает false. Если classinfo является кортежем объектов класса или типа (или рекурсивно, других таких кортежей), возвращает true, если объект является экземпляром любого из классов или типов. Если classinfo не является классом, типом или кортежем классов, типов и таких кортежей, возникает исключение TypeError.

+1

Большое спасибо! – pookie

+1

@pookie, добро пожаловать. Другой совет: если у вас есть другие типы, такие как dict, вы можете потратить свой код (другой, если это проверка isinstance), чтобы поддержать это. –