我正在开发Web服务器类型的应用程序,作为多语言通信的一部分,我需要序列化JSON文件中的对象。问题是我想创建一个可以接受任何自定义对象并在运行时保存它的函数,而不是根据结构限制该函数只能存储什么类型的对象。
很抱歉,如果这个问题是重复的,但是从我搜索的其他问题和答案来看,这似乎并不能解决问题的动态结构方面,因此,我提出了这个问题。
该功能将用于在PHP服务器代码和Python脚本之间进行通信,因此需要这样的解决方案
我尝试使用json.dump(data,outfile)
函数,但是问题是我需要先将此类对象转换为合法的数据结构
答案 0 :(得分: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!
但是,基本上:您确实需要自己处理此问题,可能根据每种类型而定,这取决于您的类型有多不同。哪种类型的序列化格式最适合您的用例是一个问题。