অভিধানটিকে জেএসনে রূপান্তর করা হচ্ছে


347
r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
file.write(str(r['rating']))

আমি JSON এ আমার ডেটা অ্যাক্সেস করতে সক্ষম নই। আমি কি ভুল করছি?

TypeError: string indices must be integers, not str

উত্তর:


536

json.dumps()অভিধানকে strবস্তুকে রূপান্তর করে , কোনও json(dict)বস্তুকে নয়! তাই আপনি যদি লোড করতে হবে তা হচ্ছে আপনার strএকটি মধ্যে dictব্যবহার করে এটিকে ব্যবহার করতে json.loads()পদ্ধতি

json.dumps()একটি সংরক্ষণ পদ্ধতি এবং json.loads()পুনরুদ্ধার পদ্ধতি হিসাবে দেখুন ।

এটি কোড নমুনা যা আপনাকে এটি আরও বুঝতে সাহায্য করতে পারে:

import json

r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
loaded_r = json.loads(r)
loaded_r['rating'] #Output 3.5
type(r) #Output str
type(loaded_r) #Output dict

11
আপনি কি মনে করেন না যে loaded_rআপনি ইতিমধ্যে এটি রেখে এসেছেন তা বিবেচনা করে জাসনকে একটি পৃথক ভেরিয়েবলে ফেরত দেওয়া কিছুটা অক্ষম r?
টিম

ওহে! আমি বুঝতে পারি এটি একটি পুরানো উত্তর, তবে আমি আশা করছিলাম যে আপনি একটি জিনিস পরিষ্কার করতে পারেন। @ টিমকাস্টেলিজানস উল্লেখ করেছেন যে জসনকে নতুন ভেরিয়েবল লোডেড_আরে ফিরিয়ে আনতে এটি অদক্ষ। এটি করার দক্ষ উপায়টি কি কেবল r = json.loads (r) এ বলা যায়?
শ্রোডিংগারস্ট্যাট

2
নিবন্ধন করুন আমি মনে করি না এটি পারফরম্যান্সকে অনেক পরিবর্তন করে। আপনি 'টাইমিট' ফাংশনটি ব্যবহার করে পরীক্ষা করতে পারেন। আপনি যদি সত্যিই একটি দ্রুত জসন লোড / ডাম্প চান তবে আপনি 'উজসন' লাইব্রেরিটি ব্যবহার করতে পারেন!
ইমান মির্জাদেহ

14
আমি সন্দেহ করি @ টিমকাস্টেলিজেন্স ইমরানের উদ্দেশ্যকে ভুল বুঝেছেন। JSON একটি নতুন ভেরিয়েবলে লোড করা হয়েছে কারণ এটি নতুন তথ্য নয়, তবে এটি দেখানোর জন্য যে নতুন অভিধানে থাকা মানগুলি, অর্থাৎ JSON এনকোড এবং ডিকোড রাউন্ড ট্রিপের পরে, অভিন্ন are
ডাম্বলডেড

43

json.dumps()পাইথন ডিকের JSON স্ট্রিং প্রতিনিধিত্ব করে। দস্তাবেজগুলি দেখুন

আপনি করতে পারবেন না r['rating']কারণ r একটি স্ট্রিং, ডিক আর নয়

সম্ভবত আপনি কিছু বোঝানো হয়েছে

r = {'is_claimed': 'True', 'rating': 3.5}
json = json.dumps(r) # note i gave it a different name
file.write(str(r['rating']))

2

এটি ব্যবহার করে স্ট্রিংয়ে রূপান্তর করার দরকার নেই json.dumps()

r = {'is_claimed': 'True', 'rating': 3.5}
file.write(r['is_claimed'])
file.write(str(r['rating']))

আপনি ডেক অবজেক্ট থেকে সরাসরি মানগুলি পেতে পারেন।


1

অভিধানকে আর হিসাবে সংজ্ঞায়িত করার কৌশলটি করা উচিত:

>>> r: dict = {'is_claimed': 'True', 'rating': 3.5}
>>> print(r['rating'])
3.5
>>> type(r)
<class 'dict'>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.