1

La question est similaire à Deserializing JSON with unknown fields, mais je voudrais utiliser le construit dans DataContractJsonSerializer à la place.Désérialisation d'un objet JSON avec des champs inconnus

J'ai des données JSON comme ça:

{ 
"known1": "foo", 
"known2": "bar", 
"more":{ "unknown12345": { "text": "foo", "label": "bar"}, 
     "unknown67890": { "text": "foo","label":"bar"} 
     } 
} 

Je pensais que je peux faire la DataContract comme ça:

[DataMember(Name = "known1")] 
     public string K1 { get; set; } 
[DataMember(Name = "known2")] 
     public string K2 { get; set; } 
[DataMember(Name = "more")] 
     public Dictionary<string,TwoStringMembersClass> More { get; set; } 

Et le TwoStringMembersClass est ceci:

[DataContract(Name = "TwoStringMembersClass ")] 
    public class TwoStringMembersClass 
    { 
     [DataMember(Name = "text")] 
     public string Text { get; set; } 

     [DataMember(Name = "label")] 
     public string Label { get; set; } 
    } 

Mais ce qui semble fonctionner dans JSON.Net ne semble pas fonctionner aussi facilement avec l'analyseur JSON natif. En ReadObject() j'obtiens une ArgumentException, probablement à cause du Dictionary.

Une idée quelle est la meilleure solution comment faire ce travail?

Merci d'avance.

+0

Pouvez-vous publier la définition de TwoStringMembersClass. Vous pouvez également voir si cela fonctionne avec Dictionary . – calum

+0

@calum TwoStringMembersClass est maintenant fourni .... aussi Dictionary jette la même exception :-( – Marco

Répondre

1

Le DataContractJsonSerializer ne prend pas en charge la désérialisation Dictionary<TKey, TValue> à partir d'une notation d'objet dans JSON. Il prend uniquement en charge le traitement d'un dictionnaire en tant que tableau. D'où le besoin JSON désérialiser dans les types que vous avez définis devrait ressembler à ceci: -

{ 
    "known1": "foo", 
    "known2": "bar", 
    "more":[{ "Key": "unknown12345", "Value": { "text": "foo", "label": "bar"} }, 
      { "Key": "unknown67890", "Value": { "text": "foo","label":"bar"} } 
      ] 
} 

Si le schéma de l'entrée JSON ne peut pas être modifié, alors vous ne vont pas être en mesure d'utiliser le DataContractJsonSerializer.

+0

Je craignais autant.Merci de toute façon.Il est également possible de construire l'analyseur par vous-même avec le soutien du construit dans xml/json parser, mais il est beaucoup plus affort Voir les détails dans cette entrée de blog: http://mutelight.org/articles/using-the-little-known-built-in-net-json-parser – Marco

+0

@sav : Si j'essayais de faire la sérialisation avec mon code, j'utiliserais l'espace de noms 'System.Json' spécifique à Silverlight avec les méthodes d'extension LINQ, ce qui peut être assez efficace et étonnamment court. – AnthonyWJones

Questions connexes