2016-06-23 8 views
2

を使用して失敗しました。C#デシリアライズ辞書<Int,Object>は私がシリアライズ/デシリアライゼーションのためNewtonsoft Json.NETライブラリを使用していますJson.NET

プロパティのようなプロパティを持つオブジェクトを直列化解除する際に問題が発生しました。辞書< int、object>です。辞書では、Objectはどんなタイプでもかまいません。ここで

は、私がテストのためにやっていることです。簡単なWPFアプリケーションでボタンクリックで

[DataContract] 
    public class MyClass 
    { 
     [DataMember(Order = 1)] 
     public int ID { get; set; } 

     [DataMember] 
     public string Text { get; set; } 

     [DataMember] 
     public Dictionary<int,object> sub { get; set; } 
    } 
    [DataContract] 
    public class MyClass2 
    { 
     [DataMember] 
     public int ID2 { get; set; } 
     [DataMember] 
     public string Text2 { get; set; } 
    } 

 MyClass c = new MyClass() { ID = 1, Text = "Hello", sub = new Dictionary<int, object>() }; 

     MyClass2 c2 = new MyClass2() { ID2 = 2, Text2 = "sub1" }; 
     c.sub.Add(1, c2); 

     MyClass2 c3 = new MyClass2() { ID2 = 3, Text2 = "sub2" }; 
     c.sub.Add(2, c3); 

     string file = "c:\\newfile.txt"; 

     if (File.Exists(file)) 
      File.Delete(file); 

     Newtonsoft.Json.JsonSerializer ser = new Newtonsoft.Json.JsonSerializer(); 

     File.WriteAllText(file, JsonConvert.SerializeObject(c)); 

     MyClass o = JsonConvert.DeserializeObject<MyClass>(File.ReadAllText(file)); 
    } 

Serilaized JSON文字列 -

{ "テキスト": "こんにちは"、 "サブ":{ "1":{ "ID2":2、 "テキスト2": "SUB1"} 、 "2":{ "ID2":3、 "テキスト2": "SUB2"}}、 "ID":デシリアライゼーションで1}

- MyClassのインスタンスのproertiesが解決されるが、プロパティ辞書(サブ)には、まだMyClass2に解決されていないjson文字列があります。

誰も私を助けてくださいことはできますか?

+1

'TypeNameHandling.All'を使用してみてください。 [TypeName Handling setting](http://www.newtonsoft.com/json/help/html/serializetypenamehandling.htm)を参照してください。 – dbc

+0

こちらを参照してください:[Newtonsoft JSON.NETとIEnumerableをにJSONをデシリアライズする方法](https://stackoverflow.com/questions/6348215/how-to-deserialize-json-into-ienumerablebasetype-with-newtonsoft-json-net/6495299#6495299)。 – dbc

+0

@dbc:TypeNameHandling.Allで動作することを理解します。解決していただきありがとうございます。このjsonをJavascriptオブジェクトに送り、同じ形式で返すことは可能ですか?ここ – Jeet

答えて

1

あなたの問題を解決するためにあなたに

[DataMember] 
    public Dictionary<int,object> sub { get; set; } 

を変更する必要があります。

MyClass c = new MyClass() { ID = 1, Text = "Hello", sub = new Dictionary<int, MyClass2>() }; 
[DataMember] 
    public Dictionary<int,MyClass2> sub { get; set; } 

MyClass c = new MyClass() { ID = 1, Text = "Hello", sub = new Dictionary<int, object>() }; 

あなたのMyClass2、MyClassNをデシリアライズするために10

EDIT

...あなたはそれがオブジェクトをデシリアライズすることはできませんTypeNameHandling.All

MyClass o = JsonConvert.DeserializeObject<MyClass>(File.ReadAllText(file), new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }); 
+0

それは可能な方法ですが、辞書には、MyClass2、MyClass3、MyClass4などのように複数の種類のオブジェクトを追加することができます。だから私はそれを辞書に命名した。 – Jeet

1

を使用する必要があります。 Json.NETは正確なクラスを判別できません。

関連する問題