আমি কি জর্ডনকে অর্ডারডিক্টে লোড করতে পারি?


427

ঠিক আছে তাই আমি একটি অর্ডারডিক্ট ব্যবহার করতে পারি json.dump। এটি, একটি অর্ডারডিক্ট জেএসএনের ইনপুট হিসাবে ব্যবহার করা যেতে পারে।

কিন্তু এটি কি আউটপুট হিসাবে ব্যবহার করা যেতে পারে? যদি তাই হয়, কিভাবে? আমার ক্ষেত্রে আমি loadঅর্ডারডিক্টে প্রবেশ করতে চাই যাতে আমি কীগুলির ক্রমটি ফাইলটিতে রাখতে পারি।

যদি তা না হয় তবে কি একধরণের কাজ আছে?


শৃঙ্খলা বজায় রাখার চেষ্টা কখনও হয়নি, যদিও আমি অবশ্যই দেখতে পারি এটি কীভাবে কার্যকর হবে।
feathj

1
হ্যাঁ, আমার ক্ষেত্রে আমি বিভিন্ন ভাষা এবং অ্যাপ্লিকেশনগুলির মধ্যে ব্যবধানটি কমিয়ে দিচ্ছি এবং জেএসএন খুব ভালভাবে কাজ করে। কিন্তু কীগুলির ক্রম ক্রমটি কিছুটা ইস্যু। json.loadপাইথনে ডিক্টসের পরিবর্তে অর্ডারডিক্টস ব্যবহার করার জন্য একটি সহজ টিক চিহ্ন দেওয়া খুব দুর্দান্ত হবে।
c00kiemonster

3
জেএসওএন স্পেস অবজেক্টের
ধরণটিকে আনর্ডারড

3
কী অর্ডারিং সাধারণত কোনও ধরণের কার্যকরী প্রয়োজনীয়তার জন্য নয়। এটি মূলত কেবল মানুষের পাঠযোগ্যতার জন্য। আমি যদি চাই যে আমার জসনটি বেশ মুদ্রিত হোক, আমি কোনও নথির আদেশের কোনও পরিবর্তন হওয়ার আশা করি না।
পিক্লস

5
এটি বড় গিটের ভিন্নতা এড়াতেও সহায়তা করে!
রিচার্ড রাস্ট

উত্তর:


609

হ্যা, তুমি পারো. JSONDecoderobject_pairs_hookযুক্তি নির্দিষ্ট করে । প্রকৃতপক্ষে, এটি ডকুমেন্টেশনে প্রদত্ত সঠিক উদাহরণ।

>>> json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode('{"foo":1, "bar": 2}')
OrderedDict([('foo', 1), ('bar', 2)])
>>> 

আপনি এই প্যারামিটারটি json.loads(যদি আপনার অন্যান্য উদ্দেশ্যে ডিকোডার উদাহরণের প্রয়োজন না হয়) তেমন পাস করতে পারেন:

>>> import json
>>> from collections import OrderedDict
>>> data = json.loads('{"foo":1, "bar": 2}', object_pairs_hook=OrderedDict)
>>> print json.dumps(data, indent=4)
{
    "foo": 1,
    "bar": 2
}
>>> 

ব্যবহার json.loadএকইভাবে করা হয়:

>>> data = json.load(open('config.json'), object_pairs_hook=OrderedDict)

3
আমি বিভ্রান্ত দস্তাবেজগুলি বলছে যে অবজেক্ট_প্লে_হুকটি প্রতিটি আক্ষরিকের জন্য ডেকে আনে যা জোড়ায় ডিকোড হয়। কেন এটি JSON এ প্রতিটি রেকর্ডের জন্য একটি নতুন অর্ডারডিক্ট তৈরি করে না?
টিম কেটিং 19

3
হুম ... ডক্স কিছুটা অস্পষ্টভাবে বানানো হয়েছে। তাদের অর্থ কী যে "সমস্ত জোড়া ডিকোডিংয়ের পুরো ফলাফল" পাস হবে, একটি তালিকা হিসাবে object_pairs_hook, "প্রতিটি জুড়ি বস্তু_সামান্য_হুক" এ পাঠানো হবে "
সিঙ্গেল নেজেশন ইলিমিনেশন

কিন্তু ইনপুট জসন এর মূল ক্রমটি হারাবে?
এসআইস্লাম

দেখতে বিস্মিত ছিল json.loadএটি ডিফল্ট দ্বারা আদেশ পালন না করে, কিন্তু এটা মত দেখাচ্ছে শুধুমাত্র মিরর কি JSON নিজেই করে - {}unordered আছে, কিন্তু []JSON মধ্যে হয় হিসাবে বর্ণনা আদেশ এখানে
এলাচ

1
@ র্যান্ডমকারেনটি হ্যাঁ, উত্সকে বিশ্লেষণ করার সময় যতবার JSON অবজেক্টের মুখোমুখি হয়, OrderedDictফলাফল অজগর মানটি তৈরি করতে ব্যবহৃত হবে।
সিঙ্গেলাইজেশন ইলিমিনেশন

125

পাইথন ২.7+ এর জন্য সাধারণ সংস্করণ

my_ordered_dict = json.loads(json_str, object_pairs_hook=collections.OrderedDict)

অথবা পাইথনের জন্য 2.4 থেকে 2.6

import simplejson as json
import ordereddict

my_ordered_dict = json.loads(json_str, object_pairs_hook=ordereddict.OrderedDict)

4
আহ, তবে এতে অবজেক্ট_ পেয়ার_ হুক অন্তর্ভুক্ত নেই - এজন্য আপনার এখনও ২.6-তে সরলজসন দরকার। ;)
mjhm

8
এটি নোট করতে চান simplejsonএবং ordereddictআপনার ইনস্টল করতে হবে এমন পৃথক গ্রন্থাগার are
ফুনেহে

2
পাইথন ২.7++ এর জন্য: কোডটিতে "জাস্টসন আমদানি করুন, সংগ্রহগুলি", পাইথন ২..6- এর জন্য "অ্যাপটিটিউড ইনস্টল পাইথন-পিপ" এবং সিস্টেমে "পাইপ ইনস্টল অর্ডারডিক্ট"
জিটল

এটি JSONDecoder এর সাথে পূর্বের পদ্ধতির তুলনায় অনেক বেশি সহজ এবং দ্রুত এগিয়ে।
নাতিম

অদ্ভুতভাবে, পাইপিতে, অন্তর্ভুক্ত জেসন ব্যর্থ হবে loads('{}', object_pairs_hook=OrderedDict)
ম্যাথু শিংকেল

37

কিছু দুর্দান্ত খবর! সংস্করণ ৩.6 থেকে সিপাইথন বাস্তবায়ন অভিধানের সন্নিবেশ ক্রম সংরক্ষণ করেছে ( https://mail.python.org/pipermail/python-dev/2016- সেপ্টেম্বর/146327.html )। এর অর্থ হল যে জেসন লাইব্রেরি এখন ডিফল্টরূপে সংরক্ষণের আদেশ দিচ্ছে। অজগর 3.5 এবং 3.6 এর মধ্যে আচরণের পার্থক্যটি পর্যবেক্ষণ করুন। কোড:

import json
data = json.loads('{"foo":1, "bar":2, "fiddle":{"bar":2, "foo":1}}')
print(json.dumps(data, indent=4))

পাই ৩.৫-এ ফলস্বরূপ অর্ডারটি সংজ্ঞায়িত করা হয়েছে:

{
    "fiddle": {
        "bar": 2,
        "foo": 1
    },
    "bar": 2,
    "foo": 1
}

পাইপথন বাস্তবায়নে পাইথন ৩.6:

{
    "foo": 1,
    "bar": 2,
    "fiddle": {
        "bar": 2,
        "foo": 1
    }
}

সত্যিই দুর্দান্ত খবরটি হ'ল এটি অজগর ৩.7 হিসাবে ভাষা স্পেসিফিকেশন হয়ে গেছে (সিপথন ৩. )++ বাস্তবায়নের বিপরীতে): https://mail.python.org/pipermail/python-dev/2017- ডিসেম্বার/151283 .html

সুতরাং আপনার প্রশ্নের উত্তর এখন হয়ে যায়: অজগর 3.6 এ আপগ্রেড করুন! :)


1
যদিও আমি প্রদত্ত উদাহরণে আপনার মতো একই আচরণ দেখি, পাইথন ৩.6.৪ এর সিপিথন বাস্তবায়নে আমার json.loads('{"2": 2, "1": 1}')হয়ে যায় {'1': 1, '2': 2}
fuglede

1
dict.__repr__অন্তর্নিহিত ক্রম সংরক্ষণ করার সময় @ ফুগলডে এটির মতো কীগুলি মনে হয়। অন্য কথায়, json.loads('{"2": 2, "1": 1}').items()হয় dict_items([('2', 2), ('1', 1)])এমনকি যদি repr(json.loads('{"2": 2, "1": 1}'))হয় "{'1': 1, '2': 2}"
সাইমন চেরেটে

@ সিমোনচারেট এইচএম, হতে পারে; আমি আসলে কনডা এর pkgs / main / win-64 :: পাইথন -3.3.4-h0c2934d_3 এ আমার নিজস্ব পর্যবেক্ষণ পুনরুত্পাদন করতে অক্ষম, তাই এটি পরীক্ষা করা শক্ত হবে।
fuglede

এটি যদিও এখনও তেমন সাহায্য করে না, যেহেতু "নামকরণ" কীগুলি এখনও কীগুলির ক্রমটি নষ্ট করে দেবে।
হুব্রো

7

আপনি ডিকে ডাম্পিং ছাড়াও কীগুলির তালিকা সর্বদা লিখতে পারেন এবং তারপরে OrderedDictতালিকার মাধ্যমে পুনরায় পুনর্গঠন করতে পারেন ?


1
নিম্ন প্রযুক্তির সমাধানের জন্য +1। ওয়াইএএমএল-এর সাথে একই ইস্যুটি মোকাবেলা করার সময় আমি এটি করেছি তবে নকল করা কৃপা খোঁড়া, বিশেষত যখন অন্তর্নিহিত বিন্যাসটি অর্ডার সংরক্ষণ করে। ডিকের মধ্যে থাকা মূল কী-মান জোড়গুলি হারানো এড়াতে বা কীগুলির তালিকা থেকে নিখোঁজ হওয়া, সমস্ত স্পষ্টত অর্ডার করা আইটেমগুলি পরে সেগুলি পরীক্ষা করার বিষয়টিও বোধগম্য হতে পারে।
মিউ মাইন্ড

2
নিম্ন প্রযুক্তির সমাধান প্রসঙ্গটি সংরক্ষণ করে যা অন্যথায় রফতানির ফর্ম্যাটে সংরক্ষণ করা হয় না (আইওডাব্লু; কেউ জেএসওএন দেখেন এবং সেখানে "এই কীগুলি এই ক্রমে থাকা উচিত" উল্লেখ করে সেখানে কিছুই নেই যদি তারা এতে ম্যানিপুলেশন করে থাকে)।
অ্যাম্বার

কী "ডাম্পড" কীগুলির তালিকাটি সঠিক ক্রমে রয়েছে তা নির্ধারণ করে? নেস্টেড ডিক্টস সম্পর্কে কী? উভয় ডাম্পিংয়ের হ্যান্ডেল করা দরকার বলে মনে হয় এবং পুনর্নির্মাণগুলি OrdereDicts ব্যবহার করে পুনর্নির্মাণ করা দরকার ।
মার্টিনিউ

5

অভিধানের পাশাপাশি কীগুলির ক্রমযুক্ত তালিকাটি ফেলে দেওয়ার পাশাপাশি, আরেকটি স্বল্প প্রযুক্তি সমাধান যা স্পষ্ট করে বলার সুবিধা পেয়েছে, তা হ'ল কী-মান জোড়ার তালিকা (আদেশ করা) তালিকাটি ফেলে দেওয়া ordered_dict.items(); লোডিং একটি সহজ OrderedDict(<list of key-value pairs>)। জেএসএনের এই ধারণাটি নেই বলে সত্ত্বেও এটি একটি আদেশযুক্ত অভিধান পরিচালনা করে (জেএসওন অভিধানের কোনও অর্ডার নেই)।

jsonঅর্ডারডিক্টটিকে সঠিক ক্রমে ডাম্প করে ফেলেছে এমন সুযোগটি গ্রহণ করা সত্যই চমৎকার । তবে এটি সাধারণভাবে অহেতুক ভারী এবং অর্ডারডিক্ট ( যুক্তির মাধ্যমে ) হিসাবে সমস্ত জেএসওন অভিধান পড়তে হবে তাৎপর্যপূর্ণ অর্থবহ নয় object_pairs_hook, সুতরাং কেবলমাত্র যে অভিধানগুলি অর্ডার করতে হবে তার একটি স্পষ্ট রূপান্তরটিও বোধগম্য হয়।


4

সাধারণভাবে ব্যবহৃত লোড কমান্ড কাজ করবে যদি আপনি অবজেক্ট_প্লে_হুক পরামিতি নির্দিষ্ট করে থাকেন :

import json
from  collections import OrderedDict
with open('foo.json', 'r') as fp:
    metrics_types = json.load(fp, object_pairs_hook=OrderedDict)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.