पाइथन का उपयोग करते हुए JSON स्ट्रिंग को हुक में बदलें


415

मैं पायथन में JSON के साथ थोड़ा भ्रमित हूं। मेरे लिए, यह एक शब्दकोश की तरह लगता है, और इस कारण से मैं ऐसा करने की कोशिश कर रहा हूं:

{
    "glossary":
    {
        "title": "example glossary",
        "GlossDiv":
        {
            "title": "S",
            "GlossList":
            {
                "GlossEntry":
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef":
                    {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

लेकिन जब मैं करता हूं print dict(json), यह एक त्रुटि देता है।

मैं इस स्ट्रिंग को एक संरचना में कैसे बदल सकता हूं और फिर json["title"]"उदाहरण शब्दावली" प्राप्त करने के लिए कॉल कर सकता हूं ?

जवाबों:


756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']

9
Json.load और json.loads में क्या अंतर है?
शिवम अग्रवाल

5
@ शिवमअग्रवाल: वास्तव में यह टिन पर क्या कहता है ।
इग्नासियो वाज़केज़-अब्राम्स

64
@ शिवमअग्रवाल: अंतर यह है कि .load()एक फ़ाइल ऑब्जेक्ट को पार्स करता है; .loads()एक स्ट्रिंग / यूनिकोड ऑब्जेक्ट को पार्स करता है।
17

1
यह मुझे परेशान करता है कि इस फ़ंक्शन के लेखक ने कॉल करने के लिए सही फ़ंक्शन चुनने के लिए पास किए जा रहे डेटा पर एक प्रकार की जांच करने के लिए एक रैपर फ़ंक्शन नहीं लिखा था। मुझे इस्तेमाल किए गए अस्पष्ट नामकरण भी पसंद नहीं है। यहाँ मैंने इसका मुकाबला करने के लिए लिखा है: def read_json(json_data): if (type(json_data) == str): return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): return json.load(json_data) मुझे यकीन है कि इसमें सुधार किया जा सकता है, लेकिन अब आप d = read_json(j)एक 'स्ट्रॉस' या 'फाइल' पर कॉल कर सकते हैं ।
जैक्स मैथ्यू

2
@JacquesMathieu, हाय जैक्स, आपके फंक्शन के लिए थैंक्स, मैंने कभी-कभी एक मामूली सुधार किया क्योंकि मैं कभी-कभी शब्दकोशों का उपयोग करता हूं: def read_json (json_data): if (type (json_data) == str) # स्ट्रिंग्स के लिए json.loads (json_data) elif (str (प्रकार (json_data))) == "<class '_io.TextIOWrapper'>"): # फ़ाइलों के लिए json.load (json_data) elif (प्रकार (json_data) == तानाशाही): # शब्दकोशों के लिए json.loads लौटें। (json.dumps (json_data))
गेब्रियल आइज़कोरबी

98

जब मैंने जसन का उपयोग करना शुरू किया, तो मैं उलझन में था और कुछ समय के लिए इसका पता लगाने में असमर्थ था, लेकिन आखिरकार मुझे वह मिल गया जो मैं चाहता था कि
यहां सरल समाधान है

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])

आप डंप (एम) पहले क्यों हैं?
हान वान फाम

मैंने इसका उपयोग क्रमबद्धता और अलौकिकता का प्रदर्शन करने के लिए किया। का प्रयोग loads(..)पर '{"id": 2, "name": "hussain"}'भी स्वीकार किए जाते हैं जवाब की तरह ठीक होना चाहिए।
हुसैन

1
डंप और लोड मेरे लिए एकदम सही काम करता है, जबकि स्वीकृत जवाब नहीं है, बहुत बहुत धन्यवाद @ मुझे बचाने के लिए एक time, FYI करें, मैं loadsutf-8 एन्कोडिंग के साथ गतिशील तारों से कोशिश कर रहा हूं ...
मोहम्मद सूफियान

19

स्पीडअप के लिए सिम्पलसन या सीजसन का उपयोग करें

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

16

यदि आपको डेटा स्रोत पर भरोसा है, तो आप evalअपनी स्ट्रिंग को शब्दकोश में बदलने के लिए उपयोग कर सकते हैं :

eval(your_json_format_string)

उदाहरण:

>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)

>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}

>>> print type(x), type(y)
<type 'str'> <type 'dict'>

>>> print y['a'], type(y['a'])
1 <type 'int'>

>>> print y['a'], type(y['b'])
1 <type 'bool'>

>>> print y['a'], type(y['c'])
1 <type 'str'>

1
आपके उदाहरण में स्ट्रिंग JSON नहीं है।
bfontaine

1
सच। यह एक डिक्शनरी थो के लिए है, जिसे आसानी से JSON के रूप में लोड / डंप किया जा सकता है (और निश्चित रूप से आपको एक कस्टम json एनकोडर फ़ंक्शन की आवश्यकता हो सकती है यदि आपके शब्दकोश में कोई json मान नहीं है)।
kakhkAtion

3
नहीं। आपको कोड के रूप में इनपुट डेटा का मूल्यांकन कभी नहीं करना चाहिए । यह आपकी छोटी सी पालतू परियोजना हो सकती है जो आपके द्वारा भरोसेमंद डेटा का उपयोग करती है, लेकिन खराब कोड का पुन: उपयोग किया जा सकता है और वास्तविक परियोजनाओं में दोहराए गए बुरे व्यवहारों को एक बड़ा सुरक्षा कोड छोड़ दिया जा सकता है।
NetworkMeister

और यही कारण है कि मेरा जवाब "यदि आप डेटा स्रोत पर भरोसा करते हैं" से शुरू होता है! लेकिन सच है, यह एक हैक का अधिक है, और निश्चित रूप से सबसे अच्छा अभ्यास नहीं है।
kakhkAtion

आप डेटा स्रोत पर पूरी तरह भरोसा कर सकते हैं यदि यह आपका अपना है। यह वास्तव में एक कड़े हुए जेएस ऑब्जेक्ट को एक उचित JSON स्ट्रिंग में डिक में बदलने के लिए उपयोगी है।
वडकोरक्वेस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.