2010-09-11 55 views

回答

1

您将负责编写python来对您的类进行编码和解码。你如何编码它们?这将对你如何解码他们有很大的影响。如果你超越了字典,列表,Unicode,字符串,整数,浮点数,布尔值和None,Python不会为你做任何事情。

对自定义类进行编码的规范方法是子类json.JSONEncoder并提供default方法。 default方法的签名为'self, obj',并返回obj编码在json中,如果它知道如何并返回super(clsname, self).default(obj)如果没有。

如果您将类编码为字典,那么您可以编写一个接受一个参数(解码字典)的函数并从中返回解码对象。然后将该函数传递给json.JSONDecoder的构造函数,并在该实例上使用decode方法。

总而言之,json并不适合串行化复杂的类。如果你可以捕捉整个函数的状态,以便它可以传递给init方法,那么就可以使用它,但如果没有,那么你只会伤到你的头。

2

json.dumps(somepython)给你代表Python对象somepython(它可以非常清楚是列表)和json.loads(ajsonstring)走另一条路“圆一个有效的JSON字符串 - (?)都没有任何安全问题,也不是‘投’。在Python 2.6或更高版本中,使用标准库中的json模块。如果您遇到2.5(例如,用于Google App Engine),则可以使用等效的第三方模块simplejson

+0

你所说的对于用户定义的类是完全不正确的。你必须实现一个自定义编码器来完成这个工作。 – aaronasterling 2010-09-11 02:40:06

+0

@aaron,'json.loads'将_never_返回“用户定义的类”--JSON标准中没有这样的东西,所以,这不是很明显吗?因此,如果并且当你想要转储任何东西,但是JSON定义的类型(和/或从JSON重新加载到非JSON定义的类型),显然你需要选择和编码你自己的专有编码(大概是为了知道交易另一端的Javascript也是如此;-)。这完全不限于用户定义的类,顺便说一句:大量Python自带的内置类型(例如,复数!)也超出了JSON标准。 – 2010-09-11 05:13:37

+0

绝对正确。正如我应该在我的原始评论中指出的那样,OP正在询问用户定义的类的编码实例。 – aaronasterling 2010-09-11 05:26:24

相关问题