पायथन में JSON को पार्स कैसे करें?


281

मेरी परियोजना को वर्तमान में अजगर में एक JSON संदेश प्राप्त हो रहा है जिसे मुझे जानकारी के बिट्स प्राप्त करने की आवश्यकता है। इसके उद्देश्यों के लिए, आइए इसे स्ट्रिंग में कुछ सरल JSON पर सेट करें:

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

अब तक मैं एक सूची का उपयोग करके JSON अनुरोधों को उत्पन्न कर रहा हूं और फिर json.dumps, लेकिन इसके विपरीत करने के लिए मुझे लगता है कि मुझे उपयोग करने की आवश्यकता है json.loads। हालाँकि मैं इसके साथ ज्यादा भाग्यशाली नहीं था। क्या कोई मुझे एक स्निपेट प्रदान कर सकता है जो उपरोक्त उदाहरण "2"के इनपुट के साथ वापस आएगा "two"?


8
नोट : उन लोगों के लिए जो 'एकल-उद्धरण स्ट्रिंग सीमांकक का उपयोग करने वाले डेटा के साथ यहां आते हैं , आपने गलती से पायथन शब्दकोशों के लिए स्ट्रिंग प्रतिनिधित्व प्रस्तुत किया हो सकता है। JSON हमेशा "सीमांकक का उपयोग करेगा । यदि हां, तो आपके कोड है कि पैदा करता है कि उत्पादन का उपयोग करने की मरम्मत json.dumps()के बजाय str()या repr(), और को सामने एक शब्दकोश में एक शब्दकोश के एक स्ट्रिंग प्रतिनिधित्व कन्वर्ट? अपने पायथन डेटा को पुनर्प्राप्त करने का तरीका जानने के लिए। अन्य सुराग आपके पास पायथन शाब्दिक है? के लिए देखो None, Trueया False, JSON का उपयोग करेगा null, trueऔर false
मार्टिन पीटर्स

जिनके पास jsonStr नहीं है, लेकिन शब्दकोशों की एक सूची है (संभवतः 'एकल-उद्धरण स्ट्रिंग सीमांकक के साथ), यहां भी एक नज़र डालें: stackoverflow.com/questions/41168558/…
लोरेनज़

जवाबों:


493

बहुत आसान:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']

इसके अलावा, अगर आपको बेहतर प्रदर्शन की जरूरत है तो सिंपलसन पर एक नज़र डालें । अधिक हाल के संस्करण अनुकूलन प्रदान करते हैं जो पढ़ने और लिखने में बहुत सुधार करते हैं।
unode

2
मैं वास्तव में पहले से ही सिंपलसन का उपयोग कर रहा हूं import simplejson as json:। उल्लेख करना भूल गया, लेकिन धन्यवाद :)
ingh.am

समझ गया। के .loadबजाय विधि का उपयोग कर रहा था.loads
सुनील कुमार

85

कभी-कभी आपका json एक स्ट्रिंग नहीं है। उदाहरण के लिए यदि आपको इस तरह से यूआरएल मिल रहा है:

j = urllib2.urlopen('http://site.com/data.json')

आपको json.load का उपयोग करने की आवश्यकता होगी, json.loads की नहीं:

j_obj = json.load(j)

(यह भूलना आसान है: 's' 'स्ट्रिंग' के लिए है)


बस इसे जोड़ने के लिए आप j.read () कॉल करके स्ट्रिंग सामग्री प्राप्त कर सकते हैं और फिर लोड विधि का उपयोग कर सकते हैं। इस मामले में किसी भी तरह से लोड () विधि को
.read

51

URL या फ़ाइल के लिए, का उपयोग करें json.load()। .Json सामग्री के साथ स्ट्रिंग के लिए, का उपयोग करें json.loads()

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

26

निम्नलिखित सरल उदाहरण हैं जो आपकी सहायता कर सकते हैं:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

उपरोक्त कोड के लिए आउटपुट होगा:

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

ध्यान दें कि आप इसे प्रिंट करने के लिए डंप का पहचान तर्क सेट कर सकते हैं (उदाहरण के लिए, प्रिंट json.dumps (डेटा, इंडेंट = 4) का उपयोग करते समय):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

-2

Json या ast python मॉड्यूल का उपयोग कर सकते हैं:

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2

1
आप उपयोग नहीं कर सकते ast.literal_eval()क्योंकि आपके तुच्छ पाठ और पूर्णांक केवल उदाहरणों से परे JSON के लिए समारोह, आप होगा समस्या आती है। JSON अजगर नहीं है । सिर्फ इसलिए कि कुछ JSON के साथ पार्स किया जा सकता है ast.literal_eval()जो एक उचित दृष्टिकोण नहीं बनाता है।
मार्टिन पीटर्स

1
उदाहरण के लिए, आप r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'का उपयोग कर पार्स नहीं कर सकते ast.literal_eval(), क्योंकि इसमें नल, एक बूलियन मान और एक एकल गैर-बीएमपी कोडपॉइंट है। JSON उन मूल्यों का अलग-अलग रूप से प्रतिनिधित्व करता है कि पायथन शाब्दिक उन लोगों का प्रतिनिधित्व कैसे करेंगे। json.loads()दूसरी तरफ, कि इनपुट के साथ कोई समस्या नहीं है और सही ढंग से डीकोड कि करने के लिए {'foo': None, 'bar': True, 'baz': '🤦'}
मार्टिन पीटर्स

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