জেএসওএন ভ্যালু এরির: প্রত্যাশিত সম্পত্তির নাম: লাইন 1 কলাম 2 (চর 1)


97

ডিক অবজেক্টে রূপান্তর করতে json.loads ব্যবহার করে আমার সমস্যা হচ্ছে এবং আমি কী ভুল করছি তা বুঝতে পারি না this

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)

আমি নিশ্চিত যে ত্রুটিটি দ্বিতীয় থেকে শেষ লাইনে ঘটছে is

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

তবে আমি এটি ঠিক করতে কী করব জানি না। কোন পরামর্শ প্রশংসা হবে।


4
আপনি কি সেখানে সিনট্যাক্স ত্রুটি দেখতে পাচ্ছেন? একটি বিভ্রান্তি "কি একটি অনুলিপি পেস্ট ত্রুটি?
কার্তিকর

লাইনের দ্বারা জেএসএন স্ট্রিংটি কী মুদ্রিত হয়েছিল print tweet.message.value?
লুক উডওয়ার্ড

4
ValueErrorতাদেরকে JSON ইনপুট, না আপনার কোডে একটি সমস্যা একটি ত্রুটির কারণে পাঠাতে হবে। (পাশে অনুপস্থিত "যারা স্বাভাবিকভাবে পাঠাতে একটি SyntaxErrorতাই আমি অনুমান এটি শুধু একটি কপি পেস্ট ত্রুটি।)
Cld

(উপায় দ্বারা, utf_8 ডিফল্ট json.loads তাই এটি নির্দেশ করার জন্য প্রয়োজন হয় না জন্য এনকোডিং হয়।)
Cld

ইনপুট জন্য ধন্যবাদ। প্রশ্নটি সম্পাদিত হয়েছে, এখন আরও পরিষ্কার হওয়া উচিত।
ড্রেডবাউন্ড

উত্তর:


84

json.loadsএকটি পাইথন মধ্যে একটি JSON স্ট্রিংকে লোড হবে dict, json.dumpsএকটি পাইথন ডাম্প হবে dictউদাহরণস্বরূপ, একটি JSON স্ট্রিং:

>>> 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@Cld মন্তব্যে উল্লিখিত হিসাবে আপনার স্ট্রিংগুলির আগে আপনাকে নির্দিষ্ট করার দরকার নেই ।


4
json.loads একটি -> জসন বস্তু <- একটি পাইথন ডিকের মধ্যে লোড করবে - এটি ডক্স যা বলছে তার বিপরীতে এবং এমনকি আপনার নিজের কোড যা করে - আপনি কোনও স্ট্রিংয়ে লোড () ব্যবহার করছেন, জাসন নয় বস্তু
7stud

হ্যাঁ 7 ম স্টুড, আপনি সঠিক, এটি একটি স্ট্রিং লোড করছে। তবে এটি অবশ্যই একটি বৈধ জেসন স্ট্রিং হওয়া উচিত। আমি আমার উত্তর আপডেট করেছি।
হ্যাঁ_আইটি এর_আমি

191

আমি অন্য একটি সমস্যার মুখোমুখি হয়েছি যা একই ত্রুটি প্রদান করে।

একক উদ্ধৃতি ইস্যু

আমি একক উদ্ধৃতি সহ একটি জসন স্ট্রিং ব্যবহার করেছি :

{
    'property': 1
}

তবে json.loadsজসন বৈশিষ্ট্যের জন্য কেবল ডাবল উক্তি গ্রহণ করে :

{
    "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আপনাকে পাইথন ডিকশনারির মতো জেএসওএনকে ইন্টারপেটের মাধ্যমে একক উদ্ধৃতি এবং চূড়ান্ত কমা সমস্যাগুলি থেকে রোধ করবে (সুতরাং আপনাকে পাইথন ডিকশনারি সিনট্যাক্সটি অনুসরণ করতে হবে)। এটি eval()আক্ষরিক কাঠামোর জন্য কার্যকরের একটি দুর্দান্ত এবং নিরাপদে বিকল্প ।

পাইথন ডকুমেন্টেশন বড় / জটিল স্ট্রিং ব্যবহার সম্পর্কে আমাদের সতর্ক করেছে:

সতর্কতা পাইথনের এএসটি সংকলকটিতে গভীরতার সীমাবদ্ধতার কারণে যথেষ্ট বড় / জটিল স্ট্রিং দিয়ে পাইথন ইন্টারপ্রেটারকে ক্রাশ করা সম্ভব।

একক উদ্ধৃতি সহ json.dumps

ব্যবহার করার জন্য json.dumpsএকক উদ্ধৃতি সঙ্গে সহজে আপনি এই কোড ব্যবহার করতে পারেন:

import ast
import json

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

ast ডকুমেন্টেশন

অ্যাস্ট পাইথন 3 ডক

অ্যাস্ট পাইথন 2 ডক

টুল

যদি আপনি ঘন ঘন JSON সম্পাদনা করেন তবে আপনি কোডবিউটিফাই ব্যবহার করতে পারেন । এটি আপনাকে সিনট্যাক্স ত্রুটি ঠিক করতে এবং জেএসএনকে ছোট / সুন্দর করতে সহায়তা করে।

আমি আসা করি এটা সাহায্য করবে.


10
  1. ডাবল উদ্ধৃতি সহ সমস্ত একক উদ্ধৃতি প্রতিস্থাপন
  2. আপনার স্ট্রিং থেকে '' '' তে 'ইউ' 'প্রতিস্থাপন করুন ... সুতরাং স্ট্রিংটি জসনতে লোড করার আগে অভ্যন্তরীণ ইউনিকোডগুলি স্ট্রিংয়ে মূলত রূপান্তর করুন
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))

4
অ্যাসথাইলাইট_এভাল ("{u'key ': u'val'}") ব্যবহার করা আরও অজগর উপায় way এটি সমস্ত ফর্ম্যাট সম্পর্কিত সমস্যাগুলির যত্ন নেবে
বিনয় পান্ডে

json.loads (strs.replace ('u' ',' ')) কাজ করছে না। এখানে নীচের ত্রুটিটি রয়েছে, ট্রেসব্যাক (সর্বশেষতম কলটি শেষ): ফাইল "<stdin>", লাইন 1, <Module> ফাইলের মধ্যে "/ সিস্টেম / লাইব্রেরি / ফ্রেমওয়ার্কস / পাইথন.ফ্রেমে ওয়ার্ক / ভার্সন / 2.7/lib/python2.7/json/__init__.py", লাইন 338, লোড রিটার্ন _default_decoder.decode (গুলি) অবজেক্ট, শেষ = স্ব.স্ক্যান_অনস (গুলি) , আইডিএক্স) ভ্যালু এরির: সম্পত্তির নাম প্রত্যাশা: লাইন 1 কলাম 2 (চর 1)
সঞ্জয় প্রদীপ

4

অন্যান্য সমস্ত উত্তর আপনার প্রশ্নের জবাব দিতে পারে, তবে আমি একই সমস্যার মুখোমুখি হয়েছি যা বিপথগামী হওয়ার কারণে ,যা আমি আমার জসন স্ট্রিংয়ের শেষে এইভাবে যুক্ত করেছি:

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

আমি অতিরিক্ত এটি অপসারণ করার পরে অবশেষে এটি কাজ করেছিলাম ,:

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

এই সাহায্য আশা করি! চিয়ার্স



@fedorqui যে অংশ আমার উত্তর (পরে যোগ করা হয়েছিল stackoverflow.com/posts/36599122/revisions ) এখন, আপনি হয়তো তোমার দর্শন লগ দিতে একটি +1 :)
Rishabh Agrahari

4
ওহ, আপনি ঠিক বলেছেন! এটি জানুয়ারী 2018 দ্বারা যুক্ত হয়েছিল। ক্ষমা চেয়ে এবং +1 :)
ফেডোরকি 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

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

আমি যখন echoপাইথন স্ক্রিপ্টে জেএসএনটি পাইপ করছিলাম এবং অযত্নে জেএসএন স্ট্রিংটিকে ডাবল কোটে আবৃত করেছিলাম তখন অন্য একটি ক্ষেত্রে আমি এর মুখোমুখি হয়েছিলাম :

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

নোট করুন যে JSON স্ট্রিংয়ের নিজেই উদ্ধৃতি রয়েছে এবং আমার করা উচিত ছিল:

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

হিসাবে এটি ছিল, এই কি পাইথন স্ক্রিপ্ট পেয়েছিল; {thumbnailWidth: 640}; ডাবল উদ্ধৃতি কার্যকরভাবে ছিনিয়ে নেওয়া হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.