Python:更改json解码的列表类型

时间:2012-06-04 17:09:08

标签: python json decode

在Python 2.7+中我可以使用内置json模块中的object_pairs_hook来更改已解码对象的类型。无论如何还要为列表做同样的事情吗?

一个选择是通过我获得的对象作为钩子的参数并用我自己的列表类型替换它们,但还有其他更智能的方法吗?

2 个答案:

答案 0 :(得分:9)

要执行与列表类似的操作,您需要继承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 :(得分:1)

根据源代码,它是不可能的:C级函数显式实例化内置list类型而不使用任何回调/钩子。在后备箱中也一样。