【问题标题】:Serializing and Deserializing object with JSON使用 JSON 序列化和反序列化对象
【发布时间】:2011-08-02 06:31:27
【问题描述】:

有没有办法或库将 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);

所以,最后一条语句基本上是将我们反序列化 jsonString 后得到的对象转换为 Person 对象。

【问题讨论】:

    标签: python json serialization actionscript deserialization


    【解决方案1】:

    我只能为 Python 说话。有一个用于 JSON 访问的内置库,可以在文档here 中查看。

    不幸的是,开箱即用,您无法序列化/反序列化对象,只需 dicts、lists 和简单的类型。您必须编写特定的对象编码器才能做到这一点。文档中几乎涵盖了这一点。

    【讨论】:

    • 我们之间有一个完整的答案!
    【解决方案2】:

    对于 AS3,您可以使用 Mike Chambers 的 as3corelib。

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

    编辑:经过一番谷歌搜索后,我最终在这个问题上回到了 SO:Typed AS3 JSON Encoder and Decoder? 似乎有一个用于进行类型化反序列化的库,但它并不完全健壮并且在某些方面失败了数据类型。如果你认为你可以处理这些限制,那么它可能是最好的选择,而不是编写自己的解析器或进入像 BlazeDS 这样繁重的东西。

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

    【讨论】:

    • 您提到的库更像是将类型化对象转换为 json,然后从 json 中获取名称-值映射,这些映射将被解析并形成类型化对象。是否有一些开箱即用的东西可以用来从 json 框(库)中获取类型化对象。
    • @Saurabh - 找到了一个,但它可能对你来说不够健壮。我没有亲身经历。
    • 我的 AS3 JSON 类支持类型、保留引用以允许循环、自定义类型映射(例如“Dic”="flash.utils.Dictionary")、自定义类型打包程序(也称为自定义转换器/序列化程序),并包括用于 ByteArray、Dictionary、Date、自定义高精度 DateTime/Int64/UInt64 类型、GUID、任意 Vector. 类型等的内置类型打包器。它还在映射之前预过滤运行时类型名称,因此您的映射和打包程序可以处理代码友好的名称,例如 Vector.<T> 而不是 __AS3__.vec::Vector.<T>,和 flash.utils.Dictionary 而不是 flash.utils::Dictionary
    【解决方案3】:

    请试试这个:

    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__)
    【解决方案4】:

    简短回答:不,没有。 JSON 不包括类型化对象,除了少数对象,例如数组。 as3Corelib 确实识别这些。但正如您所提到的,您会得到一个带有名称值对的对象。由于 JSON 不包含您的自定义操作脚本类,因此无法自动将 JSON 对象转换为类型化操作脚本对象。

    as3corelib 是 Fl​​ash 中 JSON 的一个很好的实用程序。然而,最新版本的 Flash 播放器(版本 10.3)包含 JSON 作为本机数据类型。

    但是用一个以JSON对象作为参数的构造函数来创建一个类并不是很困难,你可以将它解析成类变量。在使用 facebook Graph API 时,我必须一直这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-20
      • 2016-10-12
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2011-05-09
      • 2017-11-19
      • 2011-08-14
      相关资源
      最近更新 更多