2012-06-04 57 views
8

在Python 2.7+我可以使用object_pairs_hook內建JSON模塊中改變解碼對象的類型。無論如何,對列表做同樣的事情嗎?的Python:更改列表類型JSON解碼

一種選擇是要經過,我得到作爲參數傳遞給鉤,並用我自己的列表類型取代它們的對象,但沒有任何其他的,更聰明的方式?

回答

6

與你將需要繼承JSONDecoder列表類似的東西。下面是一個簡單的例子,像object_pairs_hook一樣工作。這使用字符串掃描的純python實現而不是C實現。

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

根據源代碼,這是不可能的:C級函數顯式實例化內置的list類型而不使用任何回調/掛鉤。主幹也一樣。