首页 > 解决方案 > Python - 参数中有两个相同的函数

问题描述

我正在尝试将两个参数(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

谢谢!!

标签: pythonjson

解决方案


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

如果您设置object_pairs_hooklambda 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())

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


推荐阅读