2016-09-07 19 views
0

jsonを配列に入れたいと思います。 I持って私の試みだったPython Json to array

(同じサイズが異なる問題で)6つのJSONリンク:

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

が、私は三次元の配列を初期化する必要がありますか?私はそのような結果に取り組むことができるかどう 後には罰金のようになります。最後に

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

私はそのような動的なJSONのリンクを使用してforループを構築したい:

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

'data'を変更することがkannotタプルです。 – janbrohl

+0

これは不可能であることを意味しますか? – nicoschuck

+0

いいえ - 代わりにリストを使う必要があります:代わりに 'data = [0,0]'と一緒に使えますが、より良い解決策を私の答えを参照してください – janbrohl

答えて

0

私は強く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

私はあなたが正しく理解しているかどうかわかりません(2番目のコードサンプルのようにリストの理解の代わりにappendを使用する以外は)perfoemanceの改善の余地はあまりありません - 複数の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()) 

だけで笑いのために、ここでは1つのライナーです:

// 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

これは私がそれらを動的に使うためのすべての自分のデータを持つ配列を構築できることを意味します。それが解決策になるかもしれない。私は試してみます – nicoschuck

+1

ヘッダーをチェックせずにデコードのために取るべきエンコーディングを実際に確かめることはできません。 '.decode()'でデフォルトのエンコーディングを使うのは、ベストプラクティスではありません。 utf-8はより良い推測になります - > '.decode(" utf-8 ")' – janbrohl

+0

デフォルトのエンコーディングはutf-8です。 –