2016-09-07 3 views
0

Я хочу поместить json в массив. У меня есть 6 JSon ссылки (с одинаковым размером, но разными вопросами)Python Json для массива

Это была моя попытка:

data=('0','0') 
response = urllib.urlopen(URL) 
data[0] = json.loads(response.read()) 
response = urllib.urlopen(URL) 
data[1] = json.loads(response.read()) 

ли я инициализировать 3d массив? Позже было бы хорошо, если я могу работать на результат так:

result = data[0]['resu']['spc'] 

В конце концов, я хочу, чтобы построить цикл, который используют динамическую в JSON ссылки так:

for w in range(0,len(URLs)): 
    URLs[w]['resu']['spc'] 
+0

'data' является кортеж, который kannot быть изменен. – janbrohl

+0

Это означает, что это невозможно? – nicoschuck

+0

no - вместо этого вы должны использовать список: вместо этого он будет работать с 'data = [0,0]', но, видимо, мой ответ для лучших решений. – janbrohl

ответ

0

I настоятельно рекомендуем использовать requests (текущая документация делает это тоже), но вы можете сделать:

import json 
import urllib2 

urls=["http://example.com/json","https://example.com/json2"] # your urls here 

data=[] 
for u in urls: 
    response = urllib2.urlopen(u) 
    data.append(json.loads(response.read())) # while this normally works with Python 2, it is better to use data.append(json.loads(response.read().decode("utf8")) 

для этого вам нужно выяснить/угадать кодировку вашего ответа.

С запросами было бы гораздо проще:

import requests 

urls=["http://example.com/json","https://example.com/json2"] # your urls here 
data=[requests.get(u).json() for u in urls] 
+0

У меня была такая же идея, но это не плохо для того, чтобы преобразовать json url в каждом цикле? – nicoschuck

+0

im not sure, если я правильно вас понимаю, но (помимо использования append вместо понимания списка, как в моем втором примере кода), нет места для улучшений при перфомансе - если есть несколько URL-адресов, тогда цикл является единственным решением, кроме для 'map' – janbrohl

0

кортежи неизменны, что делает их большими для обмена между потоками, но не так хорошо для частых изменений. Вместо этого попробуйте использовать список, поскольку они предназначены для этого очень практичного случая. Это, как говорится, словарь может быть хорошо, как хорошо:

import json 
import urllib.request 

data = {} 
for url in urls: 
    with urllib.request.urlopen(url) as response: 
     if response.status_code != 200: 
      continue // Handle errors here, I chose to continue 
     // Remember that JSON must be in text format 
     data[url] = json.loads(response.read().decode()) 

Просто для смеха, вот один лайнер:

// The lack of error checking in this is staggering though! 
data = {u:json.loads(urllib.request.urlopen(u).read().decode()) for u in urls} 
+0

ok, это означает, что я мог бы построить мне массив со всеми моими данными для их динамического использования. это может быть решением. Я попробую – nicoschuck

+1

, вы не можете быть уверены, какую кодировку взять для декодирования без проверки заголовков. просто используя кодировку по умолчанию с '.decode()', возможно, не самая лучшая идея. utf-8 будет лучше догадываться -> '.decode (" utf-8 ")' – janbrohl

+0

Кодировка по умолчанию - utf-8. –

Смежные вопросы