পাইথন ব্যবহার করে জেএসএন স্ট্রিং রূপান্তর করুন to


415

আমি পাইথনের জেএসএনের সাথে কিছুটা বিভ্রান্ত। আমার কাছে এটি একটি অভিধানের মতো বলে মনে হচ্ছে এবং সে কারণে আমি এটি করার চেষ্টা করছি:

{
    "glossary":
    {
        "title": "example glossary",
        "GlossDiv":
        {
            "title": "S",
            "GlossList":
            {
                "GlossEntry":
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef":
                    {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

তবে আমি যখন করি তখন print dict(json)এটি একটি ত্রুটি দেয়।

আমি কীভাবে এই স্ট্রিংটিকে একটি কাঠামোর মধ্যে রূপান্তর করতে পারি এবং তারপরে json["title"]"উদাহরণের শব্দকোষ" পেতে কল করতে পারি?

উত্তর:


756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']

9
Json.load এবং json.loads এর মধ্যে পার্থক্য কী?
শিবম অগ্রওয়াল

5
@ শিভামআগ্রাওয়াল: টিনে ঠিক কী বলেছে এটি
ইগনাসিও ভাজকিজ-আব্রামস

64
@ শিভামআগ্রাওয়াল: পার্থক্যটি হ'ল .load()কোনও ফাইল অবজেক্টকে বিশ্লেষণ করে ; .loads()একটি স্ট্রিং / ইউনিকোড অবজেক্টকে পার্স করে।
fyngyrz

1
এটি আমাকে বিরক্ত করে যে এই ফাংশনের লেখক কল করার জন্য সঠিকভাবে ফাংশনটি স্বয়ংক্রিয়ভাবে বেছে নেওয়ার জন্য পাস করা ডেটাতে কোনও প্রকারের পরীক্ষা করতে একটি মোড়ক ফাংশন লিখেনি। আমিও অস্পষ্ট নামকরণটি পছন্দ করি না। এটি মোকাবেলায় আমি যা লিখেছিলাম তা এখানে: def read_json(json_data): if (type(json_data) == str): return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): return json.load(json_data) আমি নিশ্চিত যে d = read_json(j)এটির উন্নতি হতে পারে তবে এখন আপনি একটি জসন 'টিআর' বা 'ফাইল' কল করতে পারেন ।
জ্যাক ম্যাথিউ

2
@ জ্যাক্কস ম্যাথিউ, হাই জ্যাকস, আপনার কাজের জন্য থ্যাঙ্কস, যেহেতু আমি মাঝে মাঝে অভিধান ব্যবহার করি: ডিফ রিড_জসন (জসন_ডাটা): যদি (টাইপ (জসন_ডাটা) == টিআর): # স্ট্রিংগুলির জন্য জেএসন.লোডস (জেসন_ডাটা) এলিফ (str (প্রকার (json_data)) == "<বর্গ '_io.TextIOWrapper'>"): # ফাইলের জন্য json.load (json_data) এলিফ (টাইপ (json_data) == ডিক): # অভিধানের জন্য json.loads ফেরত (জসন.ডম্পস (জসন_ডাটা))
গ্যাব্রিয়েল আইজর্বে

98

আমি যখন জেসন ব্যবহার করা শুরু করলাম, তখন আমি বিভ্রান্ত হয়ে পড়েছিলাম এবং কিছু সময়ের জন্য এটি সনাক্ত করতে অক্ষম ছিলাম তবে শেষ পর্যন্ত আমি যা চেয়েছিলাম তা পেয়ে গেলাম
এখানে সহজ সমাধান

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])

আপনি কেন প্রথমে ডাম্প (মি)?
হান ভ্যান ফ্যাম

সিরিয়ালাইজেশন এবং ডিসরিওলাইজেশন প্রদর্শন করতে আমি এটি ব্যবহার করেছি। ব্যবহার loads(..)উপর '{"id": 2, "name": "hussain"}'এছাড়াও গৃহীত উত্তর মত জরিমানা করা উচিত।
হুসেন

1
আমার জন্য ডাম্প এবং ভারগুলি নিখুঁতভাবে কাজ করে, যদিও গৃহীত উত্তরটি নয়, অনেক ধন্যবাদ @ timeএফওয়াইআই আমাকে বাঁচানোর জন্য হাসিনকে, আমি loadsইউটিএফ -8 এনকোডিং দিয়ে গতিশীল স্ট্রিংগুলি থেকে চেষ্টা করছি ...
মোহাম্মদ সুফিয়ান

19

স্পিডআপগুলির জন্য সিম্পজসন বা সিজেসন ব্যবহার করুন

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

16

আপনি যদি ডেটা উত্সকে বিশ্বাস করেন তবে আপনি evalআপনার স্ট্রিংকে অভিধানে রূপান্তর করতে ব্যবহার করতে পারেন :

eval(your_json_format_string)

উদাহরণ:

>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)

>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}

>>> print type(x), type(y)
<type 'str'> <type 'dict'>

>>> print y['a'], type(y['a'])
1 <type 'int'>

>>> print y['a'], type(y['b'])
1 <type 'bool'>

>>> print y['a'], type(y['c'])
1 <type 'str'>

1
আপনার উদাহরণের স্ট্রিংটি JSON নয়।
bfontaine

1
সত্য। এটি কোনও অভিধানে দেখা যায়, যা সহজেই JSON হিসাবে লোড / ডাম্প করা যায় (এবং অবশ্যই আপনার কাস্টম জসন এনকোডার ফাংশনের প্রয়োজন হতে পারে যদি আপনার অভিধানে কোনও জসন মান না থাকে)।
kakkAtion

3
না। আপনি কখনই কোড হিসাবে ইনপুট ডেটা মূল্যায়ন করবেন না । এটি আপনার সামান্য পোষা প্রাণী প্রকল্প হতে পারে যা আপনার বিশ্বাস করা ডেটা ব্যবহার করে তবে খারাপ কোডটি পুনরায় ব্যবহার করা যেতে পারে এবং একটি বড় সুরক্ষা কোড রেখে সত্যিকারের প্রকল্পগুলিতে খারাপ অভ্যাসগুলি পুনরাবৃত্তি করতে পারে।
নেটওয়ার্কমাইস্টার

এবং সে কারণেই আমার উত্তরটি "যদি আপনি ডেটা উত্সকে বিশ্বাস করেন" দিয়ে শুরু হয়! তবে সত্য, এটি হ্যাক বেশি, এবং অবশ্যই সেরা অনুশীলন নয়।
kakkAtion

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