2011-08-02 158 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