1

質問はDeserializing JSON with unknown fieldsと似ていますが、代わりにDataContractJsonSerializerを組み込みたいと思います。未知のフィールドを持つJSONオブジェクトを逆シリアル化する

だから私はそのようなJSONデータを持っている:

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

私はそのようのDataContractを行うことができます考えた:

[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; } 

そしてTwoStringMembersClassはちょうどこのです:

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

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

しかし、JSON.Netで動作するように見えるのは、ネイティブJSONパーサーで簡単に動作しないようです。 ReadObject()では、おそらく辞書のためにArgumentExceptionが発生します。

どのようにこの作品を作るための最良の解決策は何ですか?

ありがとうございます。

+0

TwoStringMembersClassの定義を転記できますか? Dictionary で動作するかどうかを確認することもできます。 – calum

+0

@calum TwoStringMembersClassが提供されました....また、Dictionary は同じ例外をスローします:-( – Marco

答えて

1

DataContractJsonSerializerは、JSONのオブジェクト表記からDictionary<TKey, TValue>を逆シリアル化することをサポートしていません。辞書を配列として扱うことしかサポートしていません。入ってくるJSONのスキーマは、あなたがDataContractJsonSerializerを使用できるようにするつもりはないされ、その後変更することができない場合

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

- :そのためJSONはあなたが定義した型にデシリアライズするために必要な次のようになります。

+0

私は恐れていましたが、とにかく感謝しています。 xml/jsonパーサーでビルドされていますが、それははるかにアフォートです。このブログのエントリの詳細を参照してください:http://mutelight.org/articles/using-the-little-known-built-in-net-json-parser – Marco

+0

@sav私のコードでシリアライズしようとすると、Silverlight固有の 'System.Json'ネームスペースとLINQ拡張メソッドを使用します。これは非常に効果的で驚くほど短くできます。 – AnthonyWJones

関連する問題