2013-07-19 6 views
2

Mon projet obtient beaucoup de chaînes JSON via UDP, chaque chaîne décrivant une liste d'objets. Je ne pourrais pas écrire une fonction qui obtiendrait une certaine liste, et faire de Derialization à cette liste. Le problème est que je ne peux pas faire de Derialization sans connaître le nom de classe des objets qui composent la liste. J'ai essayé de donner le champ d'identification de chaque département. Mais ici aussi, je n'ai pas pu faire de Derialization pour un champ spécifique, parce que le nom du département n'est pas connu.Prblem dans la désérialisation de JSON

Quelqu'un at-il une solution?

+2

Inclure au moins ** un exemple de l'entrée JSON qui cause le problème et ** idéalement ** votre code qui tente de le désérialiser. –

+0

Avez-vous une chance d'influencer les données qui vous parviennent? – Zoka

Répondre

2

Oui, le problème JSON. J'irais dans le sens de l'encapsulation. Tout d'abord je voudrais créer l'emballage:

public class JSONObjectWrapper 
{ 
    public string ObjectType; 
    public string ObjectInJSON; 
    [DoNotSerialize] // sorry do not remember the attribute to exclude it from serialization 
    public object ObjectData; 
} 

Au cours de sérialisation vous sérialiser explicitement ObjectData dans ObjectInJSON. Et puis envoyez le JSONOBjectWrapper sérialisé.

Sur le côté entrant, vous savez toujours qu'il s'agit de JSONObjectWrapper. Désérialisez-le - par ceci vous obtenez le JSON avec l'objet et le type d'objet. Trouvez ce type d'objet, créez-le à l'aide d'une fabrique, puis désérialisez-le de OBjectInJSON en ObjectData.

La procédure ci-dessus ne fonctionne que si vous pouvez faire l'emballage du côté émission. Sinon, vous êtes vissé :-)

+0

J'ai choisi cette solution .. tnx! –

2

faire toutes vos entités get mis en œuvre à partir de la classe de base:

public abstract class BaseEntity 
{ 
    public EntityTypeEnum EntityType {get;set;} 
} 

public enum EntityTypeEnum 
{ 
    EntityOne, 
    EntityTwo, 
    EntityThree 
} 

Maintenant vous pouvez désérialiser au début de votre entité de JSON à BaseEntity, regardez quel genre d'entité que vous obtenez fin désérialiser puis le type que vous obtenir.

JsonSerializer js = new JsonSerializer(); 
    var baseEntity = js.Deserialize<BaseEntity>() 
    switch(baseEntity.EntityType) 
    { 
     case EntityOne: 
     var result= js.Deserialize<EntityOne>(); 
     //DoSomeThing 
     break; 
     case EntityTwo: 
     var result= js.Deserialize<EntityTwo>(); 
     //DoSomeThing 
     break; 
    } 

EDIT pour Zoka

Si vous souhaitez implémenter quoi que ce soit d'autre par votre entité que vous pouvez faire comme ceci:

public class AnythingElse : BaseEntity 
{ 
    //... 
} 

public class EntityFour : AnythingElse 
{ 
    //.... 
} 

EDIT №2 pour Zoka

Si vous avez besoin que vos DTO soient implémentés à partir de n'importe quelle autre bibliothèque tierce st faire comme ceci:

public abstract class BaseEntity : AnyOther3rdPartyLibraryClass 
{ 
    public EntityTypeEnum EntityType {get;set;} 
} 

public class EntityFive : BaseEntity 
{ 
    ... 
} 
+0

Juste pour être précis - cette solution est meilleure que la mienne (donc +1), mais est inutile dans le cas où vous ne pouvez pas hériter vos données de toute autre chose. Ensuite, ma solution est meilleure - non intrusive. – Zoka

+0

Vous pouvez réellement hériter. J'ai modifié ma réponse. – Maris

+0

Peut-être que vous ne pouvez pas. Que faire si vous avez besoin d'envoyer la classe X à partir d'une DLL tierce? – Zoka