您可以创建一个专门的类来利用 json 库和内置方法来处理转换。
示例演员班:
import json
class Cast(object):
def __init__(self):
super(Cast, self).__init__()
@staticmethod
def _to(clazz, obj):
if (clazz == str):
return json.dumps(obj, default=lambda obj: obj.__dict__)
else:
newinstance = clazz()
if (isinstance(obj, str)):
jsonObj = json.loads(obj)
sharedKeys = jsonObj.keys()
for objKey in sharedKeys:
setattr(newinstance, objKey, jsonObj[objKey])
else:
# Test/Convert for other standard or custom types
pass
return newinstance
代码说明:
-
Cast._to 方法用于将您的自定义对象转换为所需的类。使用流控处理各种情况。
-
在此示例中,如果转换为 str 类,它将使用 json 转储将对象转换为 json 字符串。
-
当转换为字符串以外的任何内容时,使用内置的 isinstance 方法来处理指定对象将如何通过流控制进行转换。
-
本例中,对于第一个else块,假设对象为json字符串。
-
json 加载方法然后将其转换为表示 clazz 对象的 dict。提取键,这将是与 clazz 对象的任何实例相同的键。
键用于从 json 对象中提取值,并使用内置的 setattr 将它们传递给新的类实例。
-
关于 Cast._to 的重要注意事项。要使第一个 else 块起作用,要转换到的自定义“clazz”必须具有要么无参数构造函数或所有的默认值论据。
这是一种类似于 Java 的方法,它总是有一个默认的无 args 构造函数,除非在这种情况下,只要 args 具有默认值,您就可以使用带 args 的构造函数。
测试
class temp(object):
def __init__(self, attr1=None, attr2=None, attr3=None):
super(temp, self).__init__()
self.attr1 = attr1
self.attr2 = attr2
self.attr3 = attr3
self.attr4 = None
def __main__():
obj = temp()
strObj = Cast._to(str, obj)
org = Cast._from(strObj, temp)
print(type(org))
print(org.attr2)
obj2 = temp("OdinsBeard", "Gungnir")
obj2.attr4 = "Fenrir"
strObj2 = Cast._to(str, obj2)
org2 = Cast._from(strObj2, temp)
print(type(org2))
print(org2.attr2)
__main__()
输出:
main.temp'>
无
main.temp'>
冈尼尔
其他选项:
如果您希望自定义对象在调用 str() 和从数组打印时自动成为 json 字符串,则需要分别覆盖自定义类的 __str__ 和 __repr__ 方法。
def __str__(self):
return json.dumps(self, default=lambda obj: obj.__dict__)
def __repr__(self):
return json.dumps(self, default=lambda obj: obj.__dict__)
测试
使用与上面第一个测试相同的设置,但使用新添加的 __str__ 和 __repr__ 方法,输出如下。
print(str(obj))
print(str(obj2))
#Output Below:
{"attr4": null, "attr2": null, "attr3": null, "attr1": null}
{"attr4": "Fenrir", "attr2": "Gungnir", "attr3": null, "attr1": "OdinsBeard"}