Доступ до елементів 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
requestsце дивовижний спосіб порозумітися з JSON .. Якщо ви обробляєте складні URL-адреси .. використовуйте їх.
Суря

Відповіді:


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а потім можете проаналізувати його за допомогою index.

Замість того, .read()щоб використовувати для проміжного збереження його в пам’яті, а потім читання json, дозвольте jsonзавантажити його безпосередньо з файлу:

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

1
класно, це працює зараз. Ви можете пояснити, чому це?
донійор

1
Яркі вже пояснив @doniyor. Це тому, що його було перетворено на дикт за допомогоюjson.loads() . Ви просто намагаєтесь отримати прямий доступ до JSON ... без перетворення на щось, що читається Python, або використовуючи для цього модуль.
Бен,

3
Краще це зробити, json.load(urllib2.urlopen('url'))щоб він завантажував його безпосередньо, а не проміжно зберігав у пам’яті
зберігав

1
Чи є спосіб повернути це, не знаючи індексу, припускаючи, що поточних записів стану було більше?
user2019182

Я отримую цю TypeError: індекси списку повинні бути цілими числами, а не Unicode. Кожного разу, коли я намагаюся використовувати слова для індексів масиву. Як я можу зробити цю роботу такою, як у вас?
Ян Тейт

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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.