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을 다루고 있다면 .. 사용하세요.
Surya

답변:


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

URL에서 얻은 것은 json 문자열입니다. 그리고 인덱스로 직접 구문 분석 할 수 없습니다. 딕셔너리로 ​​변환 json.loads한 다음 인덱스로 구문 분석 할 수 있습니다.

대신 사용하는 .read()그것을 읽어 후 메모리에 저장 중간에와 json허용 json파일에서 직접로드 :

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

1
멋지다, 지금 작동하고있다. 그 이유를 설명해 주시겠습니까?
doniyor

1
Yarkee는 이미 @doniyor를 설명했습니다. json.loads().를 사용하여 dict로 변환 되었기 때문 입니다. Python으로 읽을 수있는 것으로 변환하거나 모듈을 사용하지 않고 JSON에 직접 액세스하려고합니다.
Ben

3
더 잘 할 json.load(urllib2.urlopen('url'))그래서 메모리에 저장 중간에 그것을로드 대신 직접
jamylak

1
더 많은 현재 조건 항목이 있다고 가정하고 색인을 모르고 이것을 반환하는 방법이 있습니까?
user2019182

이 TypeError : list indices must be integers, not unicode. 배열 색인에 단어를 사용하려고 할 때마다. 이 작업을 어떻게 할 수 있습니까?
Ian Tait

28

다음은 요청 을 사용하는 대체 솔루션입니다 .

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

1
더 많은 현재 조건 항목이 있다고 가정하고 색인을 모르고 이것을 반환하는 방법이 있습니까?
user2019182

7

'temp_C'는 사전 내부 목록에있는 사전 내부 키입니다.

이 방법은 다음과 같이 작동합니다.

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

2

하나 이상의 옵션을 위해 ...이 방법으로도 할 수 있습니다.

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')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.