2012-06-04 8 views
8

अजगर 2.7+ में मैं builtin json मॉड्यूल में object_pairs_hook उपयोग कर सकते हैं डीकोड वस्तुओं के प्रकार बदलने के लिए के लिए बदलें सूची प्रकार। सूचियों के लिए वही करने के लिए वैसे भी है?पायथन: json डिकोडिंग

एक विकल्प वस्तुओं है कि मैं हुक करने के लिए तर्क के रूप में मिलता है और उन्हें अपनी खुद की सूची प्रकार के साथ की जगह के माध्यम से जाना है, लेकिन क्या कोई अन्य, समझदारी भरा तरीका है?

उत्तर

6

सूचियों के साथ कुछ ऐसा करने के लिए आपको JSONDecoder को उप-वर्गीकृत करने की आवश्यकता होगी। नीचे एक साधारण उदाहरण है जो object_pairs_hook जैसा काम करता है। यह सी कार्यान्वयन के बजाय स्ट्रिंग स्कैनिंग के शुद्ध पायथन कार्यान्वयन का उपयोग करता है।

import json 

class decoder(json.JSONDecoder): 

    def __init__(self, list_type=list, **kwargs): 
     json.JSONDecoder.__init__(self, **kwargs) 
     # Use the custom JSONArray 
     self.parse_array = self.JSONArray 
     # Use the python implemenation of the scanner 
     self.scan_once = json.scanner.py_make_scanner(self) 
     self.list_type=list_type 

    def JSONArray(self, s_and_end, scan_once, **kwargs): 
     values, end = json.decoder.JSONArray(s_and_end, scan_once, **kwargs) 
     return self.list_type(values), end 

s = "[1, 2, 3, 4, 3, 2]" 
print json.loads(s, cls=decoder) # [1, 2, 3, 4, 3, 2] 
print json.loads(s, cls=decoder, list_type=list) # [1, 2, 3, 4, 3, 2] 
print json.loads(s, cls=decoder, list_type=set) # set([1, 2, 3, 4]) 
print json.loads(s, cls=decoder, list_type=tuple) # set([1, 2, 3, 4, 3, 2]) 
1

स्रोत कोड के अनुसार यह संभव नहीं है: सी-स्तरीय फ़ंक्शन किसी भी कॉलबैक/हुक के बिना अंतर्निहित list प्रकार को तुरंत चालू करता है। ट्रंक में वही।