【发布时间】:2018-04-28 15:11:45
【问题描述】:
我正在编写一个 Django 应用程序,它将一些数据从站点发送到 python 脚本进行处理。我计划将此数据作为 JSON 字符串发送(不必如此)。理想情况下,发送的一些值是类实例,但这显然是不可能的,并且类名加上初始化类所需的任何参数必须以某种方式序列化为 JSON 值,然后再由 python 脚本反序列化。这可以通过下面的代码来实现,但它有几个问题:
我的尝试
我已将每个类所需的所有数据放在一个列表中,并用它来初始化每个类:
import json
class Class1():
def __init__(self, *args, **kwargs):
for k, v in kwargs.items():
setattr(self, k, v)
self._others = args
class Bar():
POTENTIAL_OBJECTS = {"RANGE": range,
"Class1": Class1}
def __init__(self, json_string):
python_dict = json.loads(json_string)
for key, value in python_dict.items():
if isinstance(value, list) and value[0] in Bar.POTENTIAL_OBJECTS:
setattr(self, key, Bar.POTENTIAL_OBJECTS[value[0]](*value[1], **value[2]))
else:
setattr(self, key, value)
example = ('{ "key_1":"Some string", "key_2":["heres", "a", "list"],'
'"key_3":["RANGE", [10], {}], "key_4":["Class1", ["stuff"], {"stuff2":"x"}] }')
a = Bar(example)
我的方法存在的问题
除了通常有点凌乱且不是特别优雅之外,还有其他问题。 JSON 对象中的一些列表将由用户生成,如果用户使用来自POTENTIAL_OBJECTS 的密钥,这显然会出现问题。 (在非简化版本中,Bar 将有很多子类,每个子类都有第二个POTENTIAL_OBJECTS,因此跟踪前端验证的所有潜在值会很棘手。
我的问题
感觉这必须是一个相当普遍的事情,并且必须有一些标准的模式或方法来实现这一点。是否有通用/更好的方法/方法来实现这一目标?
编辑: 我已经意识到,解决问题的一种方法是让POTENTIAL_OBJECTS 中的所有键都以下划线开头,然后针对前面用户输入中的任何下划线进行验证-结尾。似乎仍然必须有一种更好的方法来从 JSON 反序列化为比字符串/整数/布尔值/列表等更复杂的对象。
【问题讨论】:
标签: python json django class deserialization