JSON ValueError: संपत्ति के नाम की अपेक्षा: लाइन 1 कॉलम 2 (char 1)


97

मुझे json.loads का उपयोग करके किसी बड़ी वस्तु में बदलने में परेशानी हो रही है और मैं समझ नहीं पा रहा हूं कि मैं क्या गलत कर रहा हूं। सटीक त्रुटि जो मैं चला रहा हूं वह यह है कि

ValueError: Expecting property name: line 1 column 2 (char 1)

यहाँ मेरा कोड है:

from kafka.client import KafkaClient
from kafka.consumer import SimpleConsumer
from kafka.producer import SimpleProducer, KeyedProducer
import pymongo
from pymongo import MongoClient
import json

c = MongoClient("54.210.157.57")
db = c.test_database3
collection = db.tweet_col

kafka = KafkaClient("54.210.157.57:9092")

consumer = SimpleConsumer(kafka,"myconsumer","test")
for tweet in consumer:
    print tweet.message.value
    jsonTweet=json.loads(({u'favorited': False, u'contributors': None})
    collection.insert(jsonTweet)

मुझे पूरा यकीन है कि त्रुटि 2 से अंतिम पंक्ति में आ रही है

jsonTweet=json.loads({u'favorited': False, u'contributors': None})

लेकिन मुझे नहीं पता कि इसे ठीक करने के लिए क्या करना चाहिए। किसी भी सलाह की सराहना की जाएगी।


3
क्या आपको वहाँ एक सिंटैक्स त्रुटि दिखाई देती है? एक आवारा "है कि एक कॉपी पेस्ट त्रुटि?
कार्तिक

JSON स्ट्रिंग को किस लाइन से प्रिंट किया गया था print tweet.message.value?
ल्यूक वुडवर्ड

1
ValueErrorJSON इनपुट, नहीं अपने कोड में एक समस्या में किसी त्रुटि के कारण भेज रहा है। (लापता के पास जिसे "आम तौर पर भेजना चाहिए, SyntaxErrorइसलिए मुझे लगता है कि यह सिर्फ एक कॉपी पेस्ट त्रुटि है।)
सेलड

(वैसे, utf_8 json.loads के लिए डिफ़ॉल्ट एन्कोडिंग है, इसलिए इसे इंगित करने की आवश्यकता नहीं है।)
Cld

इनपुट के लिए धन्यवाद। प्रश्न संपादित किया, अब स्पष्ट होना चाहिए।
dredbound

जवाबों:


84

json.loadsएक अजगर स्ट्रिंग को एक अजगर में लोड करेगा , उदाहरण के लिए dict, एक अजगर स्ट्रिंग को अजगर स्ट्रिंग में json.dumpsडंप करेगा dict:

>>> json_string = '{"favorited": false, "contributors": null}'
'{"favorited": false, "contributors": null}'
>>> value = json.loads(json_string)
{u'favorited': False, u'contributors': None}
>>> json_dump = json.dumps(value)
'{"favorited": false, "contributors": null}'

इसलिए यह रेखा गलत है क्योंकि आप loadएक अजगर की कोशिश कर रहे हैं dict, और json.loadsएक वैध की उम्मीद कर रहे हैं json stringजो होना चाहिए <type 'str'>

इसलिए यदि आप जोंस को लोड करने की कोशिश कर रहे हैं, तो आपको बदलना चाहिए कि आप json_stringऊपर की तरह दिखने के लिए क्या लोड कर रहे हैं , या आपको इसे डंप करना चाहिए। यह दी गई जानकारी से सिर्फ मेरा सबसे अच्छा अनुमान है। यह क्या है जिसे आप पूरा करने की कोशिश कर रहे हैं?

साथ ही आपको uअपने तार से पहले निर्दिष्ट करने की आवश्यकता नहीं है , जैसा कि @ कॉल्ड ने टिप्पणियों में उल्लेख किया है।


2
json.loads a -> json object <- को python तानाशाही में लोड करेगा - जो डॉक्स के कहने के विपरीत है और यहां तक ​​कि आपका अपना कोड क्या करता है - आप एक स्ट्रिंग पर लोड () का उपयोग कर रहे हैं, json नहीं वस्तु
7stud

हां @ 7stud, आप सही हैं, यह एक स्ट्रिंग लोड कर रहा है। लेकिन यह एक वैध जौन स्ट्रिंग होना चाहिए। मैंने अपना उत्तर अपडेट कर दिया है।
Yep_It's_Me

187

मुझे एक और समस्या का सामना करना पड़ा जो समान त्रुटि देता है।

एकल उद्धरण मुद्दा

मैंने सिंगल कोट्स के साथ json string का उपयोग किया :

{
    'property': 1
}

लेकिन json.loadsjson गुण के लिए केवल दोहरे उद्धरण स्वीकार करता है :

{
    "property": 1
}

अंतिम अल्पविराम मुद्दा

json.loads अंतिम अल्पविराम स्वीकार नहीं करता है:

{
  "property": "text", 
  "property2": "text2",
}

समाधान: astएकल उद्धरण और अंतिम अल्पविराम मुद्दों को हल करने के लिए

आप astइस प्रसंस्करण के लिए पायथन 2 और 3 दोनों के लिए मानक पुस्तकालय का हिस्सा उपयोग कर सकते हैं । यहाँ एक उदाहरण है :

import ast
# ast.literal_eval() return a dict object, we must use json.dumps to get JSON string
import json

# Single quote to double with ast.literal_eval()
json_data = "{'property': 'text'}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}

# ast.literal_eval() with double quotes
json_data = '{"property": "text"}'
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}

# ast.literal_eval() with final coma
json_data = "{'property': 'text', 'property2': 'text2',}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property2": "text2", "property": "text"}

का उपयोग करना astआपको एकल उद्धरण और अंतिम कॉमा मुद्दों से रोक देगा जैसे कि JSON जैसे पायथन डिक्शनरी (ताकि आप पायथन डिक्शनरी सिंटैक्स का पालन करें)। यह eval()शाब्दिक संरचनाओं के लिए फ़ंक्शन का एक बहुत अच्छा और सुरक्षित विकल्प है ।

पायथन प्रलेखन ने हमें बड़े / जटिल स्ट्रिंग का उपयोग करने की चेतावनी दी:

चेतावनी पाइथन के एएसटी कंपाइलर में स्टैक की गहराई सीमाओं के कारण पर्याप्त रूप से बड़े / जटिल स्ट्रिंग के साथ अजगर दुभाषिया को क्रैश करना संभव है।

json.dumps सिंगल कोट्स के साथ

json.dumpsआसानी से एकल उद्धरणों का उपयोग करने के लिए आप इस कोड का उपयोग कर सकते हैं:

import ast
import json

data = json.dumps(ast.literal_eval(json_data_single_quote))

ast प्रलेखन

Ast Python 3 doc

ast Python 2 डॉक

साधन

यदि आप अक्सर JSON को संपादित करते हैं, तो आप CodeBeautify का उपयोग कर सकते हैं । यह आपको सिंटैक्स त्रुटि को ठीक करने और JSON को छोटा / सुंदर बनाने में मदद करता है।

मुझे उम्मीद है यह मदद करेगा।


10
  1. सभी सिंगल कोट्स को डबल कोट्स से बदलें
  2. अपने स्ट्रिंग्स से '' u '' को '' '' में बदलें ... इसलिए मूल रूप से स्ट्रिंग में लोड करने से पहले आंतरिक यूनिकोड को स्ट्रिंग में बदलें
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))

1
अधिक pythonic तरीका ast.literal_eval ("{u'key ': u'val'}) का उपयोग करना होगा।" यह प्रारूप संबंधी सभी समस्याओं का ध्यान रखेगा
विनय पांडे

json.loads (strs.replace ('u ",' ')) काम नहीं कर रहा है। यहाँ नीचे त्रुटि है, Traceback (सबसे हालिया कॉल अंतिम): फ़ाइल" <stdin> ", पंक्ति 1, में <मॉड्यूल> फ़ाइल ".System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", पंक्ति 338, लोड रिटर्न में _ffault_decoder.decode (s) obj, end = self.scan_once (sce)। , idx) ValueError: संपत्ति के नाम की अपेक्षा: लाइन 1 कॉलम 2 (char 1)
संजय प्रदीप

4

अन्य सभी उत्तर आपकी क्वेरी का उत्तर दे सकते हैं, लेकिन मैंने उसी मुद्दे का सामना किया, जो आवारा होने के कारण था, ,जिसे मैंने अपने json के अंत में जोड़ा था जैसे:

{
 "key":"123sdf",
 "bus_number":"asd234sdf",
}

जब मुझे ,इस तरह अतिरिक्त हटा दिया गया तो मुझे अंततः यह काम करना पड़ा :

{
 "key":"123sdf",
 "bus_number":"asd234sdf"
}

उममीद है कि इससे मदद मिलेगी! खुश होती है।


1
अच्छा है, हालांकि यह पहले से ही जेडेमा के जवाब
फेडोरक्वी 'एसओ स्टॉप हॉर्मिंग'

@fedorqui मेरे जवाब के बाद यह हिस्सा जोड़ा गया था ( stackoverflow.com/posts/36599122/revisions ) अब, आप एक +1 देना चाहते हो सकता है
ऋषभ अग्रहरी

1
ओह, तुम सही हो! यह जनवरी 2018 तक जोड़ा गया था।
क्षमायाचना

0

उदाहरण के लिए प्रयोग किया जाता है

In [15]: a = "[{'start_city': '1', 'end_city': 'aaa', 'number': 1},\
...:      {'start_city': '2', 'end_city': 'bbb', 'number': 1},\
...:      {'start_city': '3', 'end_city': 'ccc', 'number': 1}]"
In [16]: import ast
In [17]: ast.literal_eval(a)
Out[17]:
[{'end_city': 'aaa', 'number': 1, 'start_city': '1'},
 {'end_city': 'bbb', 'number': 1, 'start_city': '2'},
 {'end_city': 'ccc', 'number': 1, 'start_city': '3'}]

0

एक अलग मामला जिसमें मुझे इसका सामना करना पड़ा, जब मैं echoJSON को अपनी पाइथन स्क्रिप्ट में पाइप करने के लिए उपयोग कर रहा था और लापरवाही से JSON स्ट्रिंग को डबल कोट्स में लपेट दिया:

echo "{"thumbnailWidth": 640}" | myscript.py

ध्यान दें कि JSON स्ट्रिंग में ही उद्धरण हैं और मुझे ऐसा करना चाहिए:

echo '{"thumbnailWidth": 640}' | myscript.py

के रूप में यह था, यह क्या अजगर स्क्रिप्ट प्राप्त हुई है: {thumbnailWidth: 640}; दोहरे उद्धरण प्रभावी ढंग से छीन लिए गए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.