2013-07-18 2 views
0

J'ai une classe:désérialisation JSON avec différents types de sérialisation/désérialisation

[DataContract] 
public class A 
{ 
    [DataMember] 
    public B ArbitraryProperty { get; set;} 
} 

Lorsque sérialisé, "ArbitraryProperty" doit être sous la forme de la classe "B":

[DataContract] 
public class B 
{ 
    [DataMember] 
    public string ValueA { get; set; } 
    [DataMember] 
    public string ValueB { get; set; } 
} 

Voilà la sortie JSON:

{ 
    "ArbitraryProperty": { "ValueA": "I'm a value.", "ValueB": "I'm a value too!" } 
} 

Lorsque je récupère le même objet du serveur, la propriété revient en tant que sim chaîne PLE comme ceci:

{ 
    "ArbitraryProperty": "I'm not a B, muahahaha!!!" 
} 

Il doit y avoir un truc pour laisser le DataContractJsonSerializer savoir qu'il doit désérialiser la valeur à une chaîne au lieu d'un « B ».

Existe-t-il une manière spéciale de configurer la classe "A"? :/

Des suggestions?

+0

Cela me semble que vous avez deux classes, une qui a une propriété 'B', et une qui a une propriété' string'. Votre sortie et ce que vous dites sont deux structures de données totalement indépendantes. –

+0

@JoeEnos D'où le problème :) Je ne veux vraiment pas avoir à faire des classes différentes pour ma demande et les types de réponse ... – Tim

Répondre

0

Je ne pense pas que ce soit la bonne façon d'y aller - je pense que la bonne réponse pour la lisibilité et la convivialité est de taper correctement une requête et une classe de réponse. Mais ... La seule chose que je peux penser est de faire de la propriété un object plutôt que de le taper fortement. Vous devrez juste vous assurer que lorsque vous lui attribuez une valeur, vous affectez le bon type.

public class A 
{ 
    public object ArbitraryProperty { get; set; } 
} 

Il sera toujours sérialiser correctement:

var a = new A { ArbitraryProperty = new B { ValueA = "a", ValueB = "b" } }; 
var json = JsonConvert.SerializeObject(a); 
Console.WriteLine(json); 

Lorsque l'objet revient, désérialisation mettra cette chaîne dans la propriété.

json = "{'ArbitraryProperty':'This is some string'}"; 
a = JsonConvert.DeserializeObject<A>(json); 

Ce code fonctionne avec de simples linéariser/désérialiser de JSON.NET, mais je ne sais pas si WebAPI ou quelle que soit la technologie que vous utilisez aimeront.

+0

Je pensais que ça allait ressembler à quelque chose comme ça. Je pense que je vais suivre votre conseil, faire le bon choix et créer les différents types. Merci! – Tim

Questions connexes