【问题标题】:Is it possible to uniformly save any object in a JSON file?是否可以将任何对象统一保存在 JSON 文件中?
【发布时间】:2019-07-03 06:43:33
【问题描述】:

我正在开发一种网络服务器类型的应用程序,作为多语言通信的一部分,我需要序列化 ​​JSON 文件中的对象。问题是我想创建一个函数,它可以接受任何自定义对象并在运行时保存它,而不是将函数限制为它可以根据结构存储的对象类型。

抱歉,如果这个问题是重复的,但是从我搜索的其他问题和答案似乎没有解决问题的动态结构方面,因此导致我打开这个问题。

该函数将用于在 PHP 服务器代码和 Python 脚本之间进行通信,因此需要这样的解决方案

我曾尝试使用json.dump(data,outfile) 函数,但问题是我需要先将此类对象转换为合法的数据结构

【问题讨论】:

  • json.dump(data, outfile)
  • 问题在于,这要求任何数据对象都是有效的 JSON 可序列化对象,我的目标是将数据对象转换为合法的可序列化对象。

标签: python json


【解决方案1】:

JSON 是一种结构严格的格式,Python 的 json 模块在设计上不会尝试强制它不理解的类型。

查看this SO answer。虽然__dict__ 可能 在某些情况下有效,但通常不是您想要的。一种选择是编写一个或多个classes that inherit JSONEncoder,并提供一种方法,将您的类型或类型转换为json.dump 可以理解的基本类型。

另一种选择是编写一个父类,例如JSONSerializable 并让这些数据类型继承它,就像在其他一些语言中使用 interface 一样。将其设为abstract base class 是有道理的,但我怀疑这对您的情况很重要。在您的基类上定义一个方法,例如def dictify(self),如果有默认行为有意义就实现它,或者让它提升NotImplementedError

请注意,我没有调用方法serialize,因为实际的序列化将由json.dump 处理。

class JSONSerializable(ABC):
    def dictify(self):
        raise NotImplementedError("Missing serialization implementation!")


class YourDataType(JSONSerializable):
    def __init__(self):
        self.something = None

    # etc etc

    def dictify(self):
        return {"something": self.something}


class YourIncompleteDataType(JSONSerializable):
    # No dictify(self) implementation
    pass

示例用法:

>>> valid = YourDataType()
>>> valid.something = "really something"
>>> valid.dictify()
{'something': 'really something'}
>>> 
>>> invalid = YourIncompleteDataType()
>>> invalid.dictify()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in dictify
NotImplementedError: Missing dictify implementation!

不过,基本上:您确实需要自己处理这个问题,可能基于每种类型,具体取决于您的类型有多么不同。这只是为序列化格式化类型的哪种方法最适合您的用例的问题。

【讨论】:

  • “请注意,我没有调用serialize 方法,”他说,因为他忘记将他的示例更新为不调用方法serialize。固定。
猜你喜欢
  • 2020-06-19
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多