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 का उपयोग कर रहे हैं .. तो इसका उपयोग करें।
सूर्या

जवाबों:


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

आपको url से जो मिलता है वह एक json string है। और आपका इसे सीधे सूचकांक के साथ पार्स नहीं किया जा सकता है। आपको इसे एक डिक्टेट में बदलना चाहिए json.loadsऔर फिर आप इसे इंडेक्स के साथ पार्स कर सकते हैं।

उपयोग .read()करने के बजाय इसे अंत में मेमोरी में सेव करें और फिर इसे पढ़ने के लिए json, jsonइसे सीधे फाइल से लोड करने की अनुमति दें :

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

1
शांत, यह अब काम कर रहा है। क्या आप मुझे समझा सकते हैं कि ऐसा क्यों है?
डोनर

1
यार्की ने पहले ही @doniyor समझाया है। ऐसा इसलिए है क्योंकि इसका उपयोग एक तानाशाही में बदल गया है json.loads()। आप केवल सीधे JSON तक पहुँचने की कोशिश कर रहे हैं ... अजगर द्वारा पठनीय कुछ में बदलने या ऐसा करने के लिए एक मॉड्यूल का उपयोग किए बिना।
बेन

3
बेहतर json.load(urllib2.urlopen('url'))तो यह है कि यह इसे सीधे मेमोरी में सहेजने के बजाय सीधे लोड करता है
जामिलक

1
क्या सूचकांक को जानने के बिना इसे वापस करने का एक तरीका है, यह मानते हुए कि अधिक वर्तमान स्थिति प्रविष्टियां थीं?
user2019182

मुझे यह TypeError मिलता है: सूची सूचक पूर्णांक होना चाहिए, यूनिकोड नहीं जब भी मैं सरणी संकेत के लिए शब्दों का उपयोग करने का प्रयास करता हूं। मैं आपके जैसे काम कैसे कर सकता हूं?
इयान टैट

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

अनुरोधों के साथ विधि पाने के लिए एक और वैकल्पिक तरीका:

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

0
import json

# some JSON:
json_str =  '{ "name":"Sarah", "age":25, "city":"Chicago"}'

# parse json_str:
json = json.loads(json_str)

# get tags from json   
tags = []
for tag in json:
    tags.append(tag)
  

# print each tag name e your content
for i in range(len(tags)):
    print(tags[i] + ': ' + str(json[tags[i]]))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.