Truy cập các phần tử JSON


81

Tôi đang nhận thông tin thời tiết từ một URL.

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

và những gì tôi nhận được là:

{
  "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"
    }]        
 }
}

Làm cách nào để truy cập bất kỳ phần tử nào tôi muốn?

nếu tôi làm vậy: print wjson['data']['current_condition']['temp_C']Tôi gặp lỗi khi nói:

chỉ số chuỗi phải là số nguyên, không phải str.


2
requestslà một cách tuyệt vời để kết hợp với JSON..Nếu bạn đang xử lý các URL phức tạp .. hãy sử dụng nó.
Surya

Câu trả lời:


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

Những gì bạn nhận được từ url là một chuỗi json. Và bạn không thể phân tích cú pháp nó bằng chỉ mục trực tiếp. Bạn nên chuyển đổi nó thành một chính tả json.loadsvà sau đó bạn có thể phân tích cú pháp nó bằng chỉ mục.

Thay vì sử dụng .read()để lưu ngay lập tức nó vào bộ nhớ và sau đó đọc nó json, hãy cho phép jsontải nó trực tiếp từ tệp:

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

1
tuyệt, nó đang hoạt động ngay bây giờ. bạn có thể vui lòng giải thích cho tôi tại sao điều này là?
doniyor

1
Yarkee đã giải thích @doniyor. Đó là bởi vì nó đã được chuyển đổi sang sử dụng chính tả json.loads(). Bạn chỉ đang cố gắng truy cập trực tiếp vào JSON ... mà không cần chuyển đổi thành bất kỳ thứ gì có thể đọc được bằng Python hoặc sử dụng mô-đun để làm như vậy.
Ben

3
Better làm json.load(urllib2.urlopen('url'))nên nó tải nó trực tiếp thay vì intermediately lưu nó vào bộ nhớ
jamylak

1
Có cách nào để trả về điều này mà không cần biết chỉ mục, giả sử có nhiều mục điều kiện hiện tại hơn không?
user2019182 23/02

Tôi nhận được TypeError này: các chỉ số danh sách phải là số nguyên, không phải mã unicode Bất cứ khi nào tôi cố gắng sử dụng các từ cho các chỉ báo mảng. Làm thế nào tôi có thể làm cho điều này thành công như bạn có?
Ian Tait

28

Đây là một giải pháp thay thế sử dụng các yêu cầu :

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

1
Có cách nào để trả về điều này mà không cần biết chỉ mục, giả sử có nhiều mục điều kiện hiện tại hơn không?
user2019182 23/02

7

'temp_C' là một khóa bên trong từ điển nằm trong danh sách bên trong từ điển

Cách này hoạt động:

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

0

Một cách thay thế khác bằng cách sử dụng phương thức get với các yêu cầu:

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

0

Chỉ để có thêm một tùy chọn ... Bạn cũng có thể làm theo cách này:

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

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

Tôi hy vọng điều này có thể giúp ích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.