Python:使用jsonpickle无法两次或多次打印同一个对象。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:使用jsonpickle无法两次或多次打印同一个对象。相关的知识,希望对你有一定的参考价值。

在一个相当复杂的项目中,我在某些时候遇到了这个问题,嵌套的对象应该被打印出来,而相同的对象必须在那里存在两次或两次以上。在这里,我提供了一个简化版的代码来重现这个问题。

import jsonpickle

class nickname:
    def __init__(self, name:str, id:int):
        self.name = name
        self.id = id


class test_class:
    def __init__(self, name:str, age:int, nicknames:[nickname]):
        self.name = name
        self.age = age
        self.nicknames = nicknames

nicknames = []
nicknames.append(nickname('Bomber', 1))
nicknames.append(nickname('Roccia', 2))

test_dict = 
test_dict['key1'] = test_class('Gigi', 12, nicknames)
test_dict['key2'] = test_class('Sandro', 14, nicknames)

test_list = []
test_list.append(test_dict['key1'])
test_list.append(test_dict['key2'])
test_list.append(test_dict['key1'])

print(jsonpickle.encode(test_list, unpicklable=False))

这给出了输出。

["name": "Gigi", "age": 12, "nicknames": ["name": "Bomber", "id": 1, "name": "Roccia", "id": 2], "name": "Sandro", "age": 14, "nicknames": [null, null], null]

你可以看到重复的对象是空的。添加make_refs=False参数后,会导致。

["name": "Gigi", "age": 12, "nicknames": ["name": "Bomber", "id": 1, "name": "Roccia", "id": 2], "name": "Sandro", "age": 14, "nicknames": "[<__main__.nickname object at 0x00BF50D0>, <__main__.nickname object at 0x00BF50F0>]", "<__main__.test_class object at 0x00BF5110>"]

对象引用是存在的,但它们仍然没有被编码。

谁能告诉我如何解决这个问题?当然,我希望重复的对象被重印,而不是 "空 "字段。

谅谅

答案

我相信json pickle不支持打印出重复的对象。相反,它提供了一个对它的引用。另一种方法是使用json.dumps,并有一个lambda表达式来递归转换为字典。

import json

class nickname:
    def __init__(self, name:str, id:int):
        self.name = name
        self.id = id

class person:
    def __init__(self, name:str, age:int, nicknames:[nickname]):
        self.name = name
        self.age = age
        self.nicknames = nicknames

nicknames = [nickname('Bomber', 1), nickname('Roccia', 2)]
test_list = [person('Gigi', 12, nicknames), person('Sandro', 14, nicknames)]
results = json.dumps(test_list, default=lambda x: x.__dict__)
print(results)

这样就会输出。

["name": "Gigi", "age": 12, "nicknames": ["name": "Bomber", "id": 1, "name": "Roccia", "id": 2], "name": "Sandro", "age": 14, "nicknames": ["name": "Bomber", "id": 1, "name": "Roccia", "id": 2]]

以上是关于Python:使用jsonpickle无法两次或多次打印同一个对象。的主要内容,如果未能解决你的问题,请参考以下文章

使用 jsonpickle (python) 进行类型演化

python模块-jsonpickle

使用 jsonpickle 从文件中保存和加载对象

TCP 为什么是三次握手,而不是两次或四次?

如何在一个页面上使用一个表单两次或三次?

Python 序列化JsonPickle