2011-08-02 3 views
2

Existe-t-il un moyen ou une bibliothèque de désérialiser une chaîne JSON dans un objet typé dans ActionScript et Python?Objet de sérialisation et de désérialisation avec JSON

Par exemple.

class Person 
{ 

    String name; 

    int age; 

} 

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

String jsonString = JSON.Serialize(person); 

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

Ainsi, la dernière déclaration jette essentiellement l'objet que nous obtenons après désérialisation jsonString dans l'objet Personne.

Répondre

2

Pour AS3, vous pouvez utiliser as3corelib de Mike Chambers.

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

Modifier: Après quelques recherches sur Google j'ai fini par revenir sur SO à cette question: Typed AS3 JSON Encoder and Decoder? Il semble qu'il y ait une bibliothèque pour faire désérialisation dactylographié, mais il est pas tout à fait robuste et échoue sur certaines données les types. Si vous pensez que vous pouvez gérer les restrictions, alors il pourrait être la meilleure option à court d'écrire votre propre analyseur ou de se lancer dans quelque chose de lourd comme BlazeDS.

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

+0

la bibliothèque que vous avez mentionné est plus comme la conversion d'un objet tapé dans JSON, puis de JSON nous obtenons simplement les correspondances nom-valeur qui doivent être analysées et formulées dans un objet typé . Y at-il quelque chose hors de la boîte que je peux utiliser pour obtenir un objet typé hors de la boîte json (la bibliothèque). –

+0

@Saurabh - trouvé un, mais il pourrait ne pas être assez robuste pour vous. Je n'en ai aucune expérience personnelle. – shanethehat

+0

Ma classe AS3 JSON prend en charge les types, préserve les références pour autoriser les cycles, les mappages de types personnalisés (par exemple "Dic" = "flash.utils.Dictionary"), les routeurs de type personnalisé (convertisseurs ou sérialiseurs personnalisés) et inclut les packers de type intégrés pour ByteArray, Dictionary, Date, types personnalisés DateTime/Int64/UInt64 de haute précision, GUID, vecteur arbitraire. types, et plus encore. Il pré-filtre également les noms des types d'exécution avant le mappage afin que vos mappages et packers puissent traiter des noms conviviaux comme 'Vector. 'au lieu de' __AS3 __. Vec :: Vector. ', et' flash.utils.Dictionary' au lieu de 'flash.utils :: Dictionary'. – Triynko

2

Je ne peux parler que pour Python. Il y a une bibliothèque intégrée pour l'accès JSON, elle peut être consultée dans les documents here.

Malheureusement, vous ne pouvez pas sérialiser/désérialiser des objets, juste dict s, list s et simplement les types. Vous devez écrire des encodeurs d'objet spécifiques pour le faire. C'est à peu près couvert dans les docs.

+0

Entre nous, nous avons une réponse complète! – shanethehat

0

Réponse courte: Non, il n'y en a pas. JSON n'inclut pas les objets typés à l'exception de quelques-uns tels que les tableaux. L'as3Corelib les reconnaît. Mais comme vous l'avez mentionné, vous récupérez un objet avec des paires de valeurs de nom. Étant donné que JSON ne contient pas vos classes ActionScript personnalisées, il n'existe aucun moyen automatique de convertir un objet JSON en un objet ActionScript typé.

L'as3corelib est un excellent utilitaire pour JSON en flash. Cependant, la dernière version du lecteur Flash (version 10.3) inclut JSON en tant que type de données natif.

Mais il n'est pas très difficile de créer une classe avec un constructeur qui prend l'objet JSON comme argument, et vous pouvez l'analyser dans les variables de classe. Je dois le faire tout le temps quand je travaille avec l'API Graph facebook.

2

S'il vous plaît essayer avec ceci:

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

Notez qu'une solution encore plus générique utiliserait 'if hasattr (obj, '__dict__'): retourne obj .__ dict__' dans le corps' Serializer.encode_obj' - alors le dictionnaire d'attributs interne (état) de tout objet sera simplement sérialisé. Ce qui à son tour peut être utilisé pour simplifier encore plus: 'json.dumps (t, par défaut = lambda o: o .__ dict __)' – fnl

Questions connexes