2011-08-02 97 views
2

是否有一种方法或库将JSON字符串反序列化为ActionScript和Python中的类型化对象?使用JSON序列化和反序列化对象

例如,

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对象后,我们得到的对象。

回答

2

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

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

编辑:经过一些谷歌搜索我最终回到所以在这个问题:Typed AS3 JSON Encoder and Decoder?似乎有做类型化反序列化图书馆,但它不是完全健壮和失败的一些数据类型。如果你认为你可以处理这些限制,那么它可能是编写你自己的解析器或者像BlazeDS那样沉重的东西的最佳选择。

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

+0

你提到的库更像是出自JSON我们刚刚得到的名称 - 值映射关系将被解析并配制成类型对象的类型化对象转换成JSON,然后。有没有什么可以用来从json框(库)中获取类型化对象的框。 –

+0

@Saurabh - 找到了一个,但它可能不够强大。我没有亲身经历过。 – shanethehat

+0

我的AS3 JSON类支持类型,保留引用以允许循环,自定义类型映射(例如“Dic”=“flash.utils.Dictionary”),自定义类型打包器(又名自定义转换器/序列化器),并包括内置类型打包器用于ByteArray,Dictionary,Date,自定义高精度DateTime/Int64/UInt64类型,GUID,任意Vector。 类型,等等。它还在映射之前预先过滤运行时类型名称,以便您的映射和打包程序可以处理代码友好的名称,如“Vector”。 '而不是'__AS3 __。vec :: Vector。 '和'flash.utils.Dictionary'而不是'flash.utils :: Dictionary'。 – Triynko

2

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

不幸的是,开箱即用,您无法序列化/反序列化对象,只需要dict s,list s和简单的类型。您必须编写特定的对象编码器才能这样做。这在文档中已经涵盖了很多。

+0

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

0

简答:没有没有。 JSON不包括类型对象,但少数例如数组。 as3Corelib确实承认这些。但正如你所提到的,你得到一个带有名称值对的对象。由于JSON不包含您的自定义动作类,因此没有自动将JSON对象转换为类型化动作对象的方法。

as3corelib是一款非常适用于Flash的JSON。然而,Flash Player(版本10.3)的最新版本包含JSON作为本机数据类型。

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

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) 
+0

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