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无法两次或多次打印同一个对象。的主要内容,如果未能解决你的问题,请参考以下文章