[英]Unable to decode a json string to a python object using jsonpickle
[英]Python: unable to print the same object twice or more using 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))
這給出了 output:
[{"name": "Gigi", "age": 12, "nicknames": [{"name": "Bomber", "id": 1}, {"name": "Roccia", "id": 2}]}, {"name": "Sandro", "age": 14, "nicknames": [null, 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>"]
其中 object 引用存在,但它們仍未編碼。
有人知道如何解決這個問題嗎? 當然,我希望重印重復的對象而不是“空”字段。
謝謝
我相信 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}]}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.