মাইক ব্রেনানের উত্তর নিকটবর্তী, তবে পুরো কাঠামোটিকে পুনরায় অতিক্রম করার কোনও কারণ নেই। আপনি যদি object_hook_pairs(পাইথন ২.7++) প্যারামিটারটি ব্যবহার করেন :
object_pairs_hookanচ্ছিক ফাংশন যা জোড়গুলির অর্ডারযুক্ত তালিকার সাথে আক্ষরিক ডিকোড করা কোনও বস্তুর ফলাফলের সাথে ডাকা হবে। এর object_pairs_hookপরিবর্তে এর মানটি ব্যবহার করা হবে dict। এই বৈশিষ্ট্যটি কাস্টম ডিকোডারগুলি প্রয়োগ করতে ব্যবহার করা যেতে পারে যা কী এবং মান জোড়গুলি ডিকোড করা হয় এমন আদেশের উপর নির্ভর করে (উদাহরণস্বরূপ, collections.OrderedDictসন্নিবেশের ক্রমটি মনে রাখবে)। যদি object_hookএটিও সংজ্ঞায়িত করা হয় তবে object_pairs_hookঅগ্রাধিকার গ্রহণ করে।
এটির সাহায্যে আপনি প্রতিটি JSON অবজেক্ট আপনার হাতে তুলে ধরেন, যাতে আপনি পুনরাবৃত্তির কোনও প্রয়োজন ছাড়াই ডিকোডিংটি করতে পারেন:
def deunicodify_hook(pairs):
new_pairs = []
for key, value in pairs:
if isinstance(value, unicode):
value = value.encode('utf-8')
if isinstance(key, unicode):
key = key.encode('utf-8')
new_pairs.append((key, value))
return dict(new_pairs)
In [52]: open('test.json').read()
Out[52]: '{"1": "hello", "abc": [1, 2, 3], "def": {"hi": "mom"}, "boo": [1, "hi", "moo", {"5": "some"}]}'
In [53]: json.load(open('test.json'))
Out[53]:
{u'1': u'hello',
u'abc': [1, 2, 3],
u'boo': [1, u'hi', u'moo', {u'5': u'some'}],
u'def': {u'hi': u'mom'}}
In [54]: json.load(open('test.json'), object_pairs_hook=deunicodify_hook)
Out[54]:
{'1': 'hello',
'abc': [1, 2, 3],
'boo': [1, 'hi', 'moo', {'5': 'some'}],
'def': {'hi': 'mom'}}
লক্ষ্য করুন যে আমাকে কখনই পুনরাবৃত্তভাবে কল করতে হবে না যেহেতু আপনি যখন ব্যবহার করবেন তখন প্রতিটি বস্তু হুকের হাতে চলে যাবে object_pairs_hook। আপনাকে তালিকাগুলির বিষয়ে যত্নশীল হতে হবে তবে আপনি দেখতে পাচ্ছেন যে তালিকার মধ্যে থাকা কোনও জিনিস সঠিকভাবে রূপান্তরিত হবে এবং এটি ঘটতে আপনাকে পুনরাবৃত্তি করতে হবে না।
সম্পাদনা: একজন সহকর্মী দেখিয়েছেন যে পাইথন 2.6 নেই object_hook_pairs। আপনি এখনও খুব ছোট পরিবর্তন করে এই উইল পাইথন 2.6 ব্যবহার করতে পারেন। উপরের হুকটিতে, পরিবর্তন করুন:
for key, value in pairs:
প্রতি
for key, value in pairs.iteritems():
তার object_hookপরিবর্তে ব্যবহার করুন object_pairs_hook:
In [66]: json.load(open('test.json'), object_hook=deunicodify_hook)
Out[66]:
{'1': 'hello',
'abc': [1, 2, 3],
'boo': [1, 'hi', 'moo', {'5': 'some'}],
'def': {'hi': 'mom'}}
object_pairs_hookJSON অবজেক্টের প্রতিটি অবজেক্টের জন্য একটি কম অভিধানে ফলাফল ব্যবহার করা , যা আপনি যদি একটি বিশাল ডকুমেন্টকে বিশ্লেষণ করে থাকেন তবে কিছুটা হলেও মূল্যবান হতে পারে।
str