JSON要素へのアクセス


82

URLから天気情報を取得しています。

weather = urllib2.urlopen('url')
wjson = weather.read()

そして私が得ているのは:

{
  "data": {
     "current_condition": [{
        "cloudcover": "0",
        "humidity": "54",
        "observation_time": "08:49 AM",
        "precipMM": "0.0",
        "pressure": "1025",
        "temp_C": "10",
        "temp_F": "50",
        "visibility": "10",
        "weatherCode": "113",
        "weatherDesc": [{
            "value": "Sunny"
        }],
        "weatherIconUrl": [{
            "value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png"
        }],
        "winddir16Point": "E",
        "winddirDegree": "100",
        "windspeedKmph": "22",
        "windspeedMiles": "14"
    }]        
 }
}

必要な要素にアクセスするにはどうすればよいですか?

私がそうする場合:print wjson['data']['current_condition']['temp_C']私は言っているエラーを受け取っています:

文字列インデックスは、strではなく整数である必要があります。


2
requestsJSONとうまくやっていくための素晴らしい方法です。複雑なURLを処理している場合はそれを使用してください。
スーリヤ2013

回答:


116
import json
weather = urllib2.urlopen('url')
wjson = weather.read()
wjdata = json.loads(wjson)
print wjdata['data']['current_condition'][0]['temp_C']

URLから取得するのはjson文字列です。また、インデックスを使用して直接解析することはできません。によってそれをdictに変換する必要json.loadsがあります。そうすれば、インデックスを使用して解析できます。

を使用.read()して中間的にメモリに保存してから読み取る代わりに、ファイルから直接ロードjsonできるようjsonにします。

wjdata = json.load(urllib2.urlopen('url'))

1
かっこいい、今は動いています。これがなぜなのか説明してもらえますか?
doniyor 2013

1
Yarkeeはすでに@doniyorについて説明しています。これは、を使用してdictに変換されているためjson.loads()です。Pythonで読み取り可能なものに変換したり、モジュールを使用して変換したりせずに、JSONに直接アクセスしようとしているだけです。
ベン

3
json.load(urllib2.urlopen('url'))途中でメモリに保存するのではなく、直接ロードする方がよい
jamylak 2013

1
より多くの現在の条件エントリがあったと仮定して、インデックスを知らずにこれを返す方法はありますか?
user2019182 2018

私はこのTypeErrorを受け取ります:配列インデックスに単語を使おうとすると、リストインデックスはユニコードではなく整数でなければなりません。どうすればこれをあなたのように機能させることができますか?
IanTait19年

28

リクエストを使用した代替ソリューション次のとおりです。

import requests
wjdata = requests.get('url').json()
print wjdata['data']['current_condition'][0]['temp_C']

1
より多くの現在の条件エントリがあったと仮定して、インデックスを知らずにこれを返す方法はありますか?
user2019182 2018

7

'temp_C'は、ディクショナリ内のリスト内にあるディクショナリ内のキーです

この方法は機能します:

wjson['data']['current_condition'][0]['temp_C']
>> '10'

2

1つ以上のオプションがあります...この方法でも実行できます。

MYJSON = {
    'username': 'gula_gut',
    'pics': '/0/myfavourite.jpeg',
    'id': '1'
}

#changing username
MYJSON['username'] = 'calixto'
print(MYJSON['username'])

これがお役に立てば幸いです。


0

リクエストでgetメソッドを使用する別の代替方法:

import requests
wjdata = requests.get('url').json()
print wjdata.get('data').get('current_condition')[0].get('temp_C')

0
import json

# some JSON:
json_str =  '{ "name":"Sarah", "age":25, "city":"Chicago"}'

# parse json_str:
json = json.loads(json_str)

# get tags from json   
tags = []
for tag in json:
    tags.append(tag)
  

# print each tag name e your content
for i in range(len(tags)):
    print(tags[i] + ': ' + str(json[tags[i]]))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.