2013-04-14 7 views
5

मैं json.dumps का उपयोग कर JSON में अपनी पायथन वस्तुओं को क्रमबद्ध करने की कोशिश कर रहा हूं। यदि आप का उपयोग कर dict को क्रमबद्ध करते हैं तो इसे स्पष्ट रूप से JSON शब्दकोश {..} के रूप में क्रमबद्ध किया जाएगा; यदि आप list या tuple को क्रमबद्ध करते हैं, तो यह एक JSON सरणी होगी।यदि संभव हो तो Python dict से JSON को एक सूची के रूप में परिवर्तित करने के लिए कैसे करें

मैं जानना चाहता हूं कि यदि संभव हो तो एक पायथन dict को JSON list के रूप में आसानी से क्रमबद्ध करने का कोई तरीका है या नहीं। द्वारा यदि संभव हो तो, मेरा मतलब है अगर चाबियाँ 0 पर शुरू करने और अनुक्रम रहे हैं, उदाहरण के लिए:

{0:'data',1:'data',2:'data} 

ऊपर के रूप में JSON में धारावाहिक की जाएगी: '{"0": "data", "1": "data", "2": "data"}', लेकिन मैं चाहते हैं यह ['data','data','data'] कुंजी के बाद से के रूप में श्रृंखलाबद्ध जा करने के लिए 0 से शुरू करें और अनुक्रमित हैं।

इसके लिए मेरा तर्क इसलिए है क्योंकि मेरे पास PHP से क्रमबद्ध जेएसओएन डेटा है, जहां PHP सरणी में चाबियाँ हैं और यदि कुंजी ऊपर वर्णित अनुसार अनुक्रमित हैं, तो PHP के json.encode किसी भी अन्य में कुंजी होने पर सरणी का उपयोग करता है तरीका, वे JSON शब्दकोश के रूप में serialized हैं। मैं चाहता हूं कि मेरा JSON serializations मेरे PHP और पायथन कोड दोनों के लिए मेल खाता हो। दुर्भाग्य से, PHP कोड बदलना मेरे मामले में एक विकल्प नहीं है।

कोई सुझाव? मुझे मिला एकमात्र समाधान है कि प्रत्येक पायथन शब्दकोश को पार करने और सत्यापित करने के लिए अपना स्वयं का फ़ंक्शन लिखना और देखें कि इसे json.dumps से पहले list में परिवर्तित किया जा सकता है या नहीं।

संपादित: इस उद्देश्य यह है कि मैं हो सकता है एक list या एक dict, साथ ही, यह इसके अंदर अतिरिक्त dicts, और सूचियों, और इतने पर (नेस्टिंग) हो सकता था serializing कर रहा हूँ। मैं सोच रहा हूं कि ऐसा करने का कोई 'सरल' तरीका है, अन्यथा मेरा मानना ​​है कि मैं खुद को एक पुनरावर्ती समाधान लिख सकता हूं। लेकिन अधिक बग से बचने के लिए मौजूदा कोड का उपयोग करना हमेशा बेहतर होता है।

+0

मुझे यकीन नहीं है कि 'dict.values ​​()' py3k में काम करेगा या नहीं। इसके अलावा, एफडब्ल्यूआईडब्ल्यू, डिक्ट्स एक ऑर्डर किए गए डेटा-प्रकार नहीं हैं, इसलिए क्रमबद्ध सूची का क्रम अच्छी तरह से परिभाषित किया जाएगा, लेकिन "मनमानी" भी होगा यदि आप 'json.dumps (सूची (dict.values ​​()) करते हैं) ' – mgilson

उत्तर

3

मैं प्रत्यावर्तन के बिना एक समाधान के बारे में पता नहीं है ... हालांकि आप अपने कस्टम Encoder की encode विधि के अंदर से अपने कनवर्टर कॉल कर सकते हैं, यह सिर्फ अनावश्यक जटिलता जोड़ना होगा ।

In [1]: import json 

In [2]: d = {"0": "data0", "1": "data1", "2": {"0": "data0", "1": "data1", "2": "data2"}} 

In [3]: def convert(obj): 
    ...:  if isinstance(obj, (list, tuple)): 
    ...:   return [convert(i) for i in obj] 
    ...:  elif isinstance(obj, dict): 
    ...:   _, values = zip(*sorted(obj.items())) 
    ...:   return convert(values) 
    ...:  return obj 

In [4]: json.dumps(convert(d)) 
Out[4]: '["data0", "data1", ["data0", "data1", "data2"]]' 
2

आप tuples की एक सूची में शब्दकोश कन्वर्ट और फिर इसे सॉर्ट, के रूप में शब्दकोश आइटम जरूरी नहीं कि बाहर के क्रम में की तुलना में आप उन्हें करना चाहते आ जाएगा सकता है:

items = sorted(d.items(), key=lambda item: item[0]) 
values = [item[1] for item in items] 
json_dict = json.dumps(values) 
1

आम तौर पर आप के लिए json.JSONEncoder उपवर्ग सकता है अपना खुद का कस्टम JSON serializer बनाएं, लेकिन इससे आपको अंतर्निहित ऑब्जेक्ट प्रकारों को ओवरराइड करने की अनुमति नहीं मिल जाएगी।

आप अपने स्वयं के कस्टम dictlist वस्तु (या जो भी आप इसे कॉल करना चाहते हैं) है कि dict विस्तार नहीं करता है या list आप अपने खुद के कस्टम JSON serializer बनाने के लिए JSONEncoder.default विधि ओवरराइड करने के लिए सक्षम होना चाहिए बनाते हैं।

कि क्या आप एक कस्टम JSON serializer बना सकते हैं या रिकर्सिवली सूचियों के साथ अपने विशेष dict उदाहरणों की जगह आप एक समारोह है कि एक dict स्वीकार करता है और रिटर्न की आवश्यकता होगी की परवाह किए बिना या तो एक list या एक dict के रूप में उपयुक्त।

यहाँ एक कार्यान्वयन है:

def convert_to_list(obj): 
    obj_list = [] 
    for i in range(len(obj)): 
     if i not in obj: 
      return obj # Return original dict if not an ordered list 
     obj_list.append(obj[i]) 
    return obj_list 
संबंधित मुद्दे