Python - 参数中有两个相同的函数

时间:2018-05-25 10:56:13

标签: python json

我正在尝试将两个参数(KeepDuplicates和OrderDic)传递给Object_pairs_hooks,但不知道这样做的pythonic方法,有人可以帮忙吗?

 raw_data = json.loads(json_value, object_pairs_hook=KeepDuplicates, object_pairs_hook=OrderedDict)

KeepDuplicates - 允许重复的JSON密钥

OrderDic - 应按照与输入JSON

相同的顺序组织JSON

谢谢!

1 个答案:

答案 0 :(得分:1)

json.loads创建一个键/值对列表,默认操作是将dict应用于该值并返回它。 object_pairs_hook会对列表执行任何操作,而不是dict

如果将object_pairs_hook设置为lambda x: x(只按原样返回每个元素),它将按照读取顺序返回key_value对列表。

>>> x = '{"3": 3, "0": 0, "1": 1, "2": 2, "3": 3, "4": 4}'
>>> json.loads(x, object_pairs_hook=lambda el: el)
[('3', 3), ('0', 0), ('1', 1), ('2', 2), ('3', 3), ('4', 4)]

然后,您可以使用您订购的键/值对来制作任何类型的对象。这将是一种非常有效的方法来保持秩序并保持重复。除非您正在创建自己的对象,否则我不知道接受重复键的类字典类。列表可能是您最好的选择,也可能是您自己的课程。

class SillyClass(object):
    def __init__(self, a_list):
        self._list = a_list[:]
    def show(self):
        return self._list[:]

to_test = json.loads(x, object_pairs_hook=SillyClass)
print(to_test.show())

output => [('3', 3), ('0', 0), ('1', 1), ('2', 2), ('3', 3), ('4', 4)]