【问题标题】:Serialization of the user Class in PythonPython中用户类的序列化
【发布时间】:2019-03-02 05:28:04
【问题描述】:

我想将对象的类型用作字典键,最好将此类字典序列化为 JSON 字符串。可以对其进行反序列化,然后使用简单的“if SomeType in SomeDictionary”检查。

演示问题的最小代码示例:

import json

class Cat():
  def __init__(self, name):
    self.name = name

class Dog():
  def __init__(self, name):
    self.name = name

pets = dict()
pets[Cat] = Cat("Tom")
pets[Dog] = Dog("Rex")

print(pets.keys())
print(json.dumps(pets))

我得到错误:

dict_keys([<class '__main__.Cat'>, <class '__main__.Dog'>])
Traceback (most recent call last):
  File "python", line 17, in <module>
TypeError: keys must be a string

第17行表示带有“print(json.dumps(pets))”的行。

是否可以在 Python 中实现这样的行为?

【问题讨论】:

  • 您收到错误消息,因为您违反了不能包含 Python 对象的 JSON 格式。如果您想稍后反序列化您的对象,您应该使用适当的序列化库,例如 pickledill
  • 为了使用来自 JSON 的if SomeType in SomeDictionary",那么“某种类型”只能是一个字符串,这就是错误告诉你的......你正在尝试将一个类定义放入键,不是字符串
  • @EliKorvigo 是的,我明白这一点,我正在寻找如何解决它的解决方案。我试过泡菜,结果相同。

标签: python json serialization


【解决方案1】:

替代解决方案

pets = {"Tom" : Cat("Tom"), "Rex" : Dog("Rex")}
print(pets.keys())
print(json.dumps(pets))

最后,如果不遍历所有值,就无法说“字典中有猫或狗”

【讨论】:

    【解决方案2】:

    你可以试试这个:

    import json
    
    class Cat():
      def __init__(self, name):
        self.name = name
    
    class Dog():
      def __init__(self, name):
        self.name = name
    
    pets = dict()
    pets[str(Cat)] = Cat("Tom").__dict__ #he can get the value using pets[str(Cat)] or pets.get(str(Cat),None))
    pets[str(Dog)] = Dog("Rex").__dict__
    
    print(pets.keys())
    print(json.dumps(pets))
    

    【讨论】:

    • 问题是序列化对象的接收者对键中的字符串一无所知,他不知道字符串格式像'cat'或'Cat'或'pet_of_type_cat'或' Cat' 等。他只有 Cat 和 Dog 类。
    • 我认为我更新的答案将解决这个问题。
    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多