使用JSON序列化和反序列化对象

4
有没有一种方法或库可以将JSON字符串反序列化为ActionScript和Python中的类型化对象?
例如。
class Person
{

    String name;

    int age;

}

Person person = new Person("John", "22");

String jsonString = JSON.Serialize(person);

Person person2 = (Person) JSON.Deserialize(jsonString);

所以,上述最后一个语句实际上是将我们从json字符串反序列化得到的对象转换为Person对象。
4个回答

3
我只能代表Python进行说明。它内置了一个用于JSON访问的库,可以在这里文档中查看。
不幸的是,默认情况下,你不能序列化/反序列化对象,只能处理dictlist和简单类型。你必须编写特定的对象编码器来实现此功能。这在文档中已经详细介绍。

我们之间有一个完整的答案! - shanethehat

2
对于AS3,你可以使用Mike Chambers的as3corelib库。

https://github.com/mikechambers/as3corelib/tree/master/src/com/adobe/serialization/json

编辑:经过一些谷歌搜索,我回到了这个问题的SO页面:Typed AS3 JSON编码器和解码器? 看来有一个库可以进行类型化反序列化,但它并不完全强大,并且在某些数据类型上失败。如果您认为您可以处理这些限制,那么除了编写自己的解析器或涉及BlazeDS之类的重型工具之外,这可能是最好的选择。

http://code.google.com/p/ason/


你提到的库更像是将一个类型化对象转换为JSON,然后从JSON中获取名称-值映射,这些映射需要被解析并组成一个类型化对象。是否有一些开箱即用的东西可以让我直接从JSON盒子(即该库)中获取一个类型化对象呢? - Saurabh Lalwani
@Saurabh - 我找到了一个,但它可能不够稳健。我个人没有使用过它。 - shanethehat
我的AS3 JSON类支持类型,保留引用以允许循环,自定义类型映射(例如,“Dic”=“flash.utils.Dictionary”),自定义类型打包程序(又称自定义转换器/序列化程序),并包括内置类型打包程序,如ByteArray、Dictionary、Date、自定义高精度DateTime/Int64/UInt64类型、GUIDs、任意Vector.<T>类型等。它还会在映射之前预过滤运行时类型名称,因此您的映射和打包程序可以处理代码友好的名称,如Vector.<T>而不是__AS3__.vec::Vector.<T>,以及flash.utils.Dictionary而不是flash.utils::Dictionary - Triynko

2
请尝试使用以下内容:
import json

class Serializer:

    @staticmethod
    def encode_obj(obj):
        if type(obj).__name__ =='instance':
            return obj.__dict__ 
    @staticmethod
    def serialize(obj):
        return json.dumps(obj, default=Serializer.encode_obj)

class TestClass:

    def __init__(self):
        self.a = 1

t = TestClass()   
json_str = Serializer.serialize(t)

请注意,更通用的解决方案将在Serializer.encode_obj主体中使用if hasattr(obj, '__dict__'): return obj.__dict__ - 然后任何对象的内部属性字典(状态)都将被序列化。这反过来又可以用于进一步简化:json.dumps(t, default=lambda o: o.__dict__) - fnl

0
短回答:没有。JSON不包括类型化对象,除了一些如数组之类的对象。as3Corelib可以识别这些对象。但正如你所提到的,你会得到一个带有名称值对的对象。由于JSON不包含自定义的ActionScript类,因此没有自动将JSON对象转换为类型化ActionScript对象的方法。
as3corelib是Flash中JSON的一个很好的实用程序。然而,最新版本的Flash Player(版本10.3)已经将JSON作为本地数据类型包含在内。
但是,创建一个具有以JSON对象为参数的构造函数的类并将其解析为类变量并不是非常困难。当使用Facebook Graph API时,我经常需要这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接