Like other answers have pointed out, the accepted answer to this question seems to ignore the data structure misunderstanding of the original poster.
The main issue seems to be that the original solution treats the JSON purely as a dictionary, when in fact it is a...
dictionary within a list, within a dictionary, within a dictionary
Thus, ['data'] is required to access the top-level key:value pair of the dictionary, ['current_conditions'] accesses the next level of dictionary, then [0] must be used to access the first element of the list (which has only 1 element).
Only then can ['temp_C'] be used to access the actual value for that key and retrieve the data.
x={ "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": "\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png" }], "winddir16Point": "E", "winddirDegree": "100", "windspeedKmph": "22", "windspeedMiles": "14" }, { "cloudcover": "0", "humidity": "54", "observation_time": "08:49 AM", "precipMM": "0.0", "pressure": "1025", "temp_C": "5", "temp_F": "50", "visibility": "10", "weatherCode": "113", "weatherDesc": [{ "value": "Sunny" }], "weatherIconUrl": [{ "value": "\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png" }], "winddir16Point": "E", "winddirDegree": "100", "windspeedKmph": "22", "windspeedMiles": "14" } ] } } print(x['data']['current_condition'][0]['weatherDesc'][0]['value']) # results in 'Sunny'In answer to another question in comments,
"Is there a way to do this without knowing the index, assuming there were more current condition entries?"
Assuming numerous current_condition entries it is unlikely that you would just want one value, or if you do then you'll likely have another piece of information to locate that specific value (i.e. location or something).
Assuming you data set is named x, i.e. x = {"data": ...}.
If you want all of the current_condition entries you can loop through the list (of current_conditions) using:
y = [] for index in range(0,len(x['data']['current_condition'])) y.append(x['data']['current_condition'][index]['temp_C'])Welcome to the Treehouse Community
The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.
Posted by ada ada
How to access first element of JSON object array?
{"symbols_requested":3,"symbols_returned":3,"data":[{"symbol":"AAPL","name":"Apple}]
I want to access name
Steven Parker
1 Answer
This code appears to be a JavaScript object literal. It's JSON-compatible, but it's not in JSON format now. It also seems to have two errors:
- a quote mark is missing after "Apple"
- and closing is brace is missing at the very end
So if we fix those and format it to make it easier to read:
{"symbols_requested": 3, "symbols_returned": 3, "data": [ {"symbol": "AAPL", "name": "Apple"} ] }
We can see that "name" is a property of an object that is inside the first element of an array named "data", which is itself inside the main object. So for example, if this object were being reference by a variable named "test", you could access the name as:
test.data[0].name