2017-02-22 6 views
0

Actuellement, j'ai des données JSON que je tente de désérialiser en utilisant la classe DataContractJsonSerializer. Toutefois, l'un des tableaux dans les données contient plusieurs types d'objets. Existe-t-il un moyen de désérialiser correctement ces données? Je suis conscient que a very similar question exists, mais je préférerais ne pas utiliser Json.NET ou d'autres bibliothèques tierces.Désérialisation d'un tableau JSON multi-type à l'aide de DataContracts

EDIT: Un petit exemple:

Dans ce cas, disons que le JSON est de forme [{"foo":string},{"bar":string},{"foo":string},{"foo":string},...] où chaque élément est soit sous forme de {"foo":string} ou {"bar":string}. Ensuite, les contrats pourraient être mis en place en tant que tel:

[DataContract] 
class Foo { [DataMember] public string foo; } 

[DataContract] 
class Bar { [DataMember] public string bar; } 

Dans ce contexte, ma question est, comment puis-je deserialize ce tableau de Foo s et Bar s?

+0

'Cependant, l'un des tableaux dans les données contiennent plusieurs types de objects' - pourriez-vous donner un exemple? En quoi ces types d'objet sont-ils différents? Si pour une raison quelconque ils sont complètement différents, vous pouvez considérer le type 'dynamic'. Publier un échantillon du JSON et le modèle que vous essayez de désérialiser serait utile. –

+0

@ShaneRay Ajout d'un petit exemple, dans le cas réel, mes 'Foo' et' Bar' ont des propriétés complètement différentes. – LegionMammal978

Répondre

0

Cela ne semble pas correct. Il ne devrait pas y avoir deux types complètement différents dans un seul tableau. Compte tenu de la JSON pourvu que je voudrais essayer quelque chose comme ça ....

[DataContract] 
class SomeClass 
{ 
    [DataMember] 
    public string foo { get; set;} 
    [DataMember] 
    public string bar { get; set;} 
} 

pour vérifier ensuite IsNullOrWhiteSpace() sur chaque propriété.

Mise à jour avec plus de code ...

static void Main(string[] args) 
    { 
     SomeClass[] output; 
     var json = "[{\"foo\":\"value\"},{\"bar\":\"value\"},{\"foo\":\"value1\"},{\"foo\":\"value1\"}]"; 

     using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
     { 
      var deserializer = new DataContractJsonSerializer(typeof(SomeClass[])); 
      output = (SomeClass[])deserializer.ReadObject(ms); 
     } 

     // do something with output 
     Console.WriteLine(output.Length); 
    } 
+0

Plus précisément, j'interroge une certaine API web JSON qui donne 2 réponses (avec des formats différents) dans un tableau. – LegionMammal978

+0

Dans ce cas, vous devez avoir deux modèles distincts. Pour le premier appel d'API renvoyant un tableau, vous le désérialisez en 'ModelA'. Le deuxième appel d'API que vous désérialisez en 'ModelB'. –

+0

Je pense que vous ne comprenez pas ce que j'essaie de dire. Je passe une requête au serveur, et reçois une seule réponse avec un tableau avec un 'Foo' et un' Bar'. Je demande ici comment désérialiser ce tableau pour y récupérer les 'Foo' et' Bar'. – LegionMammal978