簡體   English   中英

Python:無法使用 jsonpickle 打印相同的 object 兩次或更多次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM