I have JSON data that I need to read and then print:
json_load =\
{"city": {"coord": {"lat": 52.2183, "lon": 6.8958},
"country": "NL",
"id": 2756071,
"name": "Enschede",
"population": 153655,
"sunrise": 1656472443,
"sunset": 1656532643,
"timezone": 7200},
"cnt": 40,
"cod": "200",
"list": [{"clouds": {"all": 50},
"dt": 1656536400,
"dt_txt": "2022-06-29 21:00:00",
"main": {"feels_like": 295.23,
"grnd_level": 1007,
"humidity": 60,
"pressure": 1012,
"sea_level": 1012,
"temp": 295.38,
"temp_kf": 2.77,
"temp_max": 295.38,
"temp_min": 292.61},
"pop": 0,
"sys": {"pod": "n"},
"visibility": 10000,
"weather": [{"description": "scattered clouds",
"icon": "03n",
"id": 802,
"main": "Clouds"}],
"wind": {"deg": 99, "gust": 1.93, "speed": 1.9}}]}
Now I want to read: feels_like
, temp
, etc.
I can read the first part on top with:
print(json_load['city']['coord'])
But if I want to read:
print(json_load['list']['main'])
I get a keyword error 0.
CodePudding user response:
Since json_load['list']
is a list, you have to use indices to access the items in it. Here's how to get the contents of the first (zeroth) element of it:
print(json_load['list'][0]['main']['feels_like']) # -> 295.23
print(json_load['list'][0]['main']['temp']) # -> 295.38
CodePudding user response:
I would personally use something like dotwiz
for fast, easy attribute-style access with dict
and nested dict
objects. This library is available on pip
:
pip install dotwiz
Usage:
from dotwiz import DotWiz
json_load = {
"city": {
"coord": {
"lat": 52.2183,
"lon": 6.8958
},
},
"list": [
{
"main": {
"feels_like": 295.23,
"temp": 295.38,
},
}
]}
dw = DotWiz(json_load)
print(dw)
print(dw.city.coord)
print()
assert dw.city.coord.lon == 6.8958
print('temp:', dw.list[0].main.temp)
print('feels like:', dw.list[0].main.feels_like)
Prints:
✫(city=✫(coord=✫(lat=52.2183, lon=6.8958)), list=[✫(main=✫(feels_like=295.23, temp=295.38))])
✫(lat=52.2183, lon=6.8958)
temp: 295.38
feels like: 295.23
If you need field auto completion and type hinting support for use in an IDE, I would suggest to subclass from DotWiz
, and then define only the fields you want to access:
from __future__ import annotations
from dotwiz import DotWiz
class MyDotClass(DotWiz):
city: City
list: list[ListData]
class City:
coord: Coord
class Coord:
lat: float
lon: float
class ListData:
main: Main
class Main:
feels_like: float
temp: float
dw = MyDotClass(json_load)
# rest same as above...
Disclaimer: I am the creator and maintener of this library.