अजगर इस JSON डेटा को पार्स क्यों नहीं कर सकता है?


1438

मेरे पास एक फाइल में यह JSON है:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [
        "id": "valore"
    ],
    "om_points": "value",
    "parameters": [
        "id": "valore"
    ]
}

मैंने यह स्क्रिप्ट JSON डेटा के सभी प्रिंट करने के लिए लिखी है:

import json
from pprint import pprint

with open('data.json') as f:
    data = json.load(f)

pprint(data)

यह कार्यक्रम एक अपवाद उठाता है, हालांकि:

Traceback (most recent call last):
  File "<pyshell#1>", line 5, in <module>
    data = json.load(f)
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 13 column 13 (char 213)

मैं JSON को पार्स कैसे कर सकता हूं और इसके मूल्यों को कैसे निकाल सकता हूं?


@kederrac दिए गए कारण के लिए: "यह प्रश्न एक टाइपो या एक समस्या के कारण हुआ था जिसे अब पुन: प्रस्तुत नहीं किया जा सकता है।" जसन अमान्य है।
रोब

@kederrac समस्या उपयोग में त्रुटि के कारण होती है क्योंकि इसे पुन: प्रस्तुत नहीं किया जा सकता है।
रोब

जवाबों:


2127

आपका डेटा मान्य JSON प्रारूप नहीं है । आपके पास []तब होना चाहिए जब आपके पास होना चाहिए {}:

  • []JSON सरणियों के लिए हैं, जिन्हें listपायथन में कहा जाता है
  • {}JSON ऑब्जेक्ट्स के लिए हैं, जिन्हें dictपायथन में कहा जाता है

यहाँ बताया गया है कि आपकी JSON फाइल कैसे दिखनी चाहिए:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": {
        "id": "valore"
    },
    "om_points": "value",
    "parameters": {
        "id": "valore"
    }
}

तब आप अपने कोड का उपयोग कर सकते हैं:

import json
from pprint import pprint

with open('data.json') as f:
    data = json.load(f)

pprint(data)

डेटा के साथ, आप अब ऐसा मान भी सकते हैं:

data["maps"][0]["id"]
data["masks"]["id"]
data["om_points"]

उन लोगों की कोशिश करें और देखें कि क्या यह समझ में आने लगता है।


1
ठीक है, इसलिए मुझे अपने कोड को नियंत्रित करना होगा क्योंकि यह json फ़ाइल एक जावा ऑब्जेक्ट से उत्पन्न होती है। धन्यवाद।
मिशेल

5
समाधान के लिए धन्यवाद। इसे प्रिंट करते समय मुझे यूनिकोड का प्रतीक मिला है। (जैसे u'valore ')। इसे कैसे रोका जाए?
डायरी

6
अच्छा है लेकिन अजगर u'प्रत्येक कुंजी से पहले जोड़ता है । कोई विचार क्यों?
कॉडीबगस्टीन

7
यही कारण है कि आपका पाठ यूनिकोड नहीं स्ट्रिंग है। अधिकांश समय जर्मन umlauts के लिए यूनिकोड में पाठ और अन्य मॉड्यूल / कार्यक्रमों आदि के साथ पाठ परिणाम साझा करने के लिए बेहतर है। तो तुम अच्छे हो!
माइकल पी

2
मैं एक अवलोकन करना चाहता हूं जो उम्मीद के मुताबिक मददगार है, और निश्चित रूप से विडंबनापूर्ण है। मुझे लगता है कि सुंदर-छपाई वाले जोंस के लिए जस्पन मॉड्यूल से हीन होने के लिए मुझे पाइंट मॉड्यूल मिलता है। यदि आप उन दोनों को आजमाते हैं, तो मुझे लगता है कि आप सहमत होंगे। अपने जसन डेटा संरचनाओं को प्रदर्शित करने और डिबग करने के लिए, मैं कर रहा हूं: आउटपुट = json.dumps (data_structure, indent = 2, sort_keys = True) प्रिंट (आउटपुट) मुझे लगता है कि आप इंडेंट-कंट्रोल, सॉर्टिंग और बुद्धिमान पाएंगे अपनी पसंद के हिसाब से डंप () विधि में लाइन-रैपिंग। अगर मेरी सोच गलत है, तो कृपया मुझे बताएं।
लॉरल्ड

307

आपको data.jsonइस तरह दिखना चाहिए:

{
 "maps":[
         {"id":"blabla","iscategorical":"0"},
         {"id":"blabla","iscategorical":"0"}
        ],
"masks":
         {"id":"valore"},
"om_points":"value",
"parameters":
         {"id":"valore"}
}

आपका कोड होना चाहिए:

import json
from pprint import pprint

with open('data.json') as data_file:    
    data = json.load(data_file)
pprint(data)

ध्यान दें कि यह केवल पायथन 2.6 और इसके बाद के withसंस्करण में काम करता है, क्योंकि यह -statement पर निर्भर करता है । पायथन 2.5 में from __future__ import with_statement, पायथन <= 2.4 में, जस्टिन पील के उत्तर को देखें , जिसका उत्तर इस पर आधारित है।

अब आप इस तरह एकल मूल्यों तक भी पहुँच सकते हैं:

data["maps"][0]["id"]  # will return 'blabla'
data["masks"]["id"]    # will return 'valore'
data["om_points"]      # will return 'value'

7
मुझे इस बात का खामियाजा भुगतना पड़ा। शायद यह स्पष्ट नहीं था, क्यों मुझे लगा कि एक और उत्तर आवश्यक था। बयान के साथ संगतता पर जोड़ा गया नोट।
Bengt

रोल बैक के लिए क्षमा करें, लेकिन सुझाया गया कोड data_file openएड को आवश्यकता से अधिक लंबा रखेगा ।
Bengt

2.6 प्रलेखन ( docs.python.org/2.6/library/io.html ) का जिक्र करते हुए , "के साथ" संदर्भ में एक फ़ाइल खोलने से स्वचालित रूप से फ़ाइल बंद हो जाएगी।
स्टीव एस।

1
@SteveS। हां, लेकिन संदर्भ से पहले नहीं छोड़ा गया है। इनकंटेक्ट pprintमें आईएनजी लंबे समय तक खुला withरहता data_fileहै।
बेंगट

1
@ GyanPathirage आप इसे एक्सेस करते हैं data["om_points"], जैसे data["masks"]["id"]। विचार यह है कि आप 'कुंजी पथों' को निर्दिष्ट करके किसी शब्दकोश में किसी भी स्तर तक पहुँच सकते हैं। यदि आपको एक KeyErrorअपवाद मिलता है तो इसका मतलब है कि मार्ग में कुंजी मौजूद नहीं है। टाइपो के लिए बाहर देखो या अपने शब्दकोश की संरचना की जाँच करें।
नूमन

71

जस्टिन पील का उत्तर वास्तव में मददगार है, लेकिन यदि आप पायथन 3 का उपयोग कर रहे हैं तो JSON को इस तरह किया जाना चाहिए:

with open('data.json', encoding='utf-8') as data_file:
    data = json.loads(data_file.read())

नोट: उपयोग json.loadsकरने के बजाय json.load। पायथन 3 में, json.loadsएक स्ट्रिंग पैरामीटर लेता है। json.loadएक फ़ाइल की तरह वस्तु पैरामीटर लेता है। data_file.read()एक स्ट्रिंग ऑब्जेक्ट देता है।

सच कहूं तो, मुझे नहीं लगता कि स्मृति के अधिकांश मामलों में सभी डेटा को लोड करना एक समस्या है।


10
पायथन 3 के json.loadपक्ष में क्यों बचा जाना चाहिए .loads?
जरीन

10
आपके द्वारा जोड़ा गया पृष्ठ बचने के बारे में कुछ नहीं कहता है load
डैन हुल्मे

28
इस उत्तर में पूरी फ़ाइल को मेमोरी में पढ़ा जाता है, जब यह नहीं होता है और यह बताता है कि पायथन 3 में JSON फ़ाइलों को आलसी नहीं पढ़ा जा सकता है, जो कि असत्य है। मुझे खेद है, लेकिन यह स्पष्ट है।
औकाज़ रोजालस्की

10
यह उत्तर सटीक नहीं है। Python3 में एक ओपन फ़ाइल हैंडलर के साथ json.load का उपयोग नहीं करने का कोई कारण नहीं है। डाउनवोट के लिए क्षमा करें, लेकिन ऐसा नहीं लगता कि आपने उपरोक्त टिप्पणियों को बहुत ध्यान से पढ़ा है।
21

5
+1 यह जवाब बहुत अच्छा है! इसके लिए धन्यवाद और मुझे एक ऐसे फंक्शन की तलाश में जाने से रोका जो स्ट्रिंग्स का उपयोग कर सकता है क्योंकि मैं केवल स्ट्रिंग्स और नेटवर्क अनुरोध के साथ काम करता हूं जो फ़ाइल नहीं हैं!
नए लोग

54
data = []
with codecs.open('d:\output.txt','rU','utf-8') as f:
    for line in f:
       data.append(json.loads(line))

8
यह सही समाधान है यदि आपके पास एक फ़ाइल में कई json ऑब्जेक्ट हैं। json.loadsकई जोंस ऑब्जेक्ट को डिकोड नहीं करता है। अन्यथा, आपको 'अतिरिक्त डेटा' त्रुटि मिलती है।
yasin_alm

यह सबसे अच्छा जवाब है। अन्यथा, यह 'अतिरिक्त डेटा' त्रुटि देता है।
Earthx9

39
किसी फ़ाइल में उत्परिवर्ती जोंस ऑब्जेक्ट होने का मतलब है कि फ़ाइल वास्तव में मान्य जौन नहीं है। यदि आपके पास json फ़ाइल में शामिल करने के लिए कई ऑब्जेक्ट हैं, तो उन्हें फ़ाइल के शीर्ष स्तर पर एक सरणी में समाहित किया जाना चाहिए।
dusktreader

एक फाइल में कई जोंस ऑब्जेक्ट होने का मतलब है कि फाइल एक सिंगल जोंस ऑब्जेक्ट नहीं है। यह स्पष्ट है। वस्तुओं में से एकल सरणी बनाना एक स्पष्ट समाधान है। लेकिन JSON डिजाइन द्वारा स्पष्ट रूप से समाप्त हो गया है, लगभग हर स्तर पर (द्वारा }, ]या ")। इसलिए आप वास्तव में अस्पष्टता के बिना, एक ही स्ट्रिंग या एकल फ़ाइल में कई वस्तुओं को एकत्र कर सकते हैं। यहाँ समस्या यह है कि एक वस्तु की अपेक्षा एक तोता तब विफल हो जाता है जब वह एक वस्तु से अधिक गुजरता है।
MSalters

किसी एकल फ़ाइल में कई JSON ऑब्जेक्ट्स का विज्ञापन करना: इसके लिए एक "मानक" है - jsonlines.org/examples इन .jsonl(json लाइनें), ऑब्जेक्ट्स को एक नई लाइन वर्ण द्वारा अलग किया जाता है जो पार्सिंग के लिए पूर्व-प्रसंस्करण बनाता है, और अनुमति देता है शुरू / अंत मार्करों के बारे में चिंता किए बिना आसानी से / बैच फ़ाइलों को विभाजित करने के लिए।
सेबी

13

"अल्ट्रा JSON" या बस "ujson" []आपके JSON फ़ाइल इनपुट में होने को संभाल सकता है । यदि आप JSON तत्वों की सूची के रूप में अपने प्रोग्राम में JSON इनपुट फ़ाइल पढ़ रहे हैं; जैसे, [{[{}]}, {}, [], etc...]ujson शब्दकोशों की सूचियों के किसी भी मनमाने क्रम को संभाल सकता है , सूचियों के शब्दकोश।

आप पायथन पैकेज इंडेक्स में ujson पा सकते हैं और एपीआई लगभग पायथन के अंतर्निहित jsonपुस्तकालय के समान है ।

यदि आप बड़ी JSON फ़ाइलों को लोड कर रहे हैं तो ujson भी बहुत तेज है। आप दिए गए लिंक में अन्य पायथन जॉन्स लाइब्रेरी की तुलना में प्रदर्शन विवरण देख सकते हैं।


9

यदि आप Python3 का उपयोग कर रहे हैं, तो आप अपना ( connection.jsonफ़ाइल) JSON बदलने का प्रयास कर सकते हैं :

{
  "connection1": {
    "DSN": "con1",
    "UID": "abc",
    "PWD": "1234",
    "connection_string_python":"test1"
  }
  ,
  "connection2": {
    "DSN": "con2",
    "UID": "def",
    "PWD": "1234"
  }
}

फिर निम्नलिखित कोड का उपयोग कर:

connection_file = open('connection.json', 'r')
conn_string = json.load(connection_file)
conn_string['connection1']['connection_string_python'])
connection_file.close()
>>> test1

1
यह भी
18.5 पर

17
यह फ़ाइल हैंडल को खुला छोड़ देता है। एक withबयान का उपयोग करना बेहतर होगा
कोरी गोल्डबर्ग

6

यहां आप संशोधित data.jsonफाइल के साथ जाएं :

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [{
        "id": "valore"
    }],
    "om_points": "value",
    "parameters": [{
        "id": "valore"
    }]
}

आप नीचे की पंक्तियों का उपयोग करके कंसोल पर डेटा को कॉल या प्रिंट कर सकते हैं:

import json
from pprint import pprint
with open('data.json') as data_file:
    data_item = json.load(data_file)
pprint(data_item)

इसके लिए अपेक्षित उत्पादन print(data_item['parameters'][0]['id']):

{'maps': [{'id': 'blabla', 'iscategorical': '0'},
          {'id': 'blabla', 'iscategorical': '0'}],
 'masks': [{'id': 'valore'}],
 'om_points': 'value',
 'parameters': [{'id': 'valore'}]}

इसके लिए अपेक्षित उत्पादन print(data_item['parameters'][0]['id']):

valore

If we would like add a column to count how many observations does "maps" have, how could we write this function?
Chenxi

5

There are two types in this parsing.

  1. Parsing data from a file from a system path
  2. Parsing JSON from remote URL.

From a file, you can use the following

import json
json = json.loads(open('/path/to/file.json').read())
value = json['key']
print json['value']

This arcticle explains the full parsing and getting values using two scenarios.Parsing JSON using Python


4

As a python3 user,

The difference between load and loads methods is important especially when you read json data from file.

As stated in the docs:

json.load:

Deserialize fp (a .read()-supporting text file or binary file containing a JSON document) to a Python object using this conversion table.

json.loads:

json.loads: Deserialize s (a str, bytes or bytearray instance containing a JSON document) to a Python object using this conversion table.

json.load method can directly read opened json document since it is able to read binary file.

with open('./recipes.json') as data:
  all_recipes = json.load(data)

As a result, your json data available as in a format specified according to this conversion table:

https://docs.python.org/3.7/library/json.html#json-to-py-table


यह पूछे गए प्रश्न का उत्तर कैसे है? उपयोगकर्ता json फ़ाइल लोड करने के लिए सही विधि का उपयोग कर रहा था।
राज006
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.