2010-09-17 29 views
34

Nesne basit bir türse, ancak nesne daha karmaşık olduğunda işe yaramazsa iyi çalışan bir Dictionary<string, object> seri hale getirmeye/kaldırmaya çalışıyorum.Seri hale getirme/serpiştirme JSON.NET ile nesne tanımı

Bu sınıf var:

Benim sözlüğünde
public class UrlStatus 
{ 
public int Status { get; set; } 
public string Url { get; set; } 
} 

ben "Zincir yönlendir" bir anahtar ve "Durum" tuşları ile birkaç basit dizeleri ile List<UrlStatus> ekleyin "URL", "Ana URL" . Geri Json.NET dan alıyorum dize şöyle görünür:

{"$type":"System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib","Status":"OK","Url":"http://www.ehow.com/m/how_5615409_create-pdfs-using-bean.html","Parent Url":"http://www.ehow.com/mobilearticle35.xml","Redirect Chain":[{"$type":"Demand.TestFramework.Core.Entities.UrlStatus, Demand.TestFramework.Core","Status":301,"Url":"http://www.ehow.com/how_5615409_create-pdfs-using-bean.html"}]} 

kod ben gibi görünüyor seri hale getirmek için kullanıyorum:

: yapıyorum serisini

JsonConvert.SerializeObject(collection, Formatting.None, new JsonSerializerSettings 
{ 
TypeNameHandling = TypeNameHandling.Objects, 
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple 
}); 

JsonConvert.DeserializeObject<T>(collection, new JsonSerializerSettings 
{ 
TypeNameHandling = TypeNameHandling.Objects, 
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple, 
}); 

Sözlük geri geliyor, tüm dizeler düzgün geliyor, ancak Liste düzgün seri hale gelmiyor. Bu, Dünya'da yine bu dizeyi deserailize edebilirsiniz Tabii

{[ 
    { 
    "$type": "XYZ.TestFramework.Core.Entities.UrlStatus, XYZ.TestFramework.Core", 
    "Status": 301, 
    "Url": "/how_5615409_create-pdfs-using-bean.html" 
    } 
]} 

olarak gelir ve ben doğru nesneyi almak, ama JSON.Net benim için yapılması gereken gibi görünüyor. Açıkçası yanlış bir şey yapıyorum ama ne olduğunu bilmiyorum.

cevap

43

Bu, Json.NET'in eski bir sürümündeki bir hata olduğunu düşünüyorum. En son sürümü kullanmıyorsanız, yeni sürüme geçin ve tekrar deneyin.

public class UrlStatus 
    { 
     public int Status { get; set; } 
     public string Url { get; set; } 
    } 


    [Test] 
    public void GenericDictionaryObject() 
    { 
     Dictionary<string, object> collection = new Dictionary<string, object>() 
     { 
      {"First", new UrlStatus{ Status = 404, Url = @"http://www.bing.com"}}, 
      {"Second", new UrlStatus{Status = 400, Url = @"http://www.google.com"}}, 
      {"List", new List<UrlStatus> 
      { 
       new UrlStatus {Status = 300, Url = @"http://www.yahoo.com"}, 
       new UrlStatus {Status = 200, Url = @"http://www.askjeeves.com"} 
      } 
      } 
     }; 

     string json = JsonConvert.SerializeObject(collection, Formatting.Indented, new JsonSerializerSettings 
     { 
     TypeNameHandling = TypeNameHandling.All, 
     TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
     }); 

     Assert.AreEqual(@"{ 
    ""$type"": ""System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib"", 
    ""First"": { 
    ""$type"": ""Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests"", 
    ""Status"": 404, 
    ""Url"": ""http://www.bing.com"" 
    }, 
    ""Second"": { 
    ""$type"": ""Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests"", 
    ""Status"": 400, 
    ""Url"": ""http://www.google.com"" 
    }, 
    ""List"": { 
    ""$type"": ""System.Collections.Generic.List`1[[Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests]], mscorlib"", 
    ""$values"": [ 
     { 
     ""$type"": ""Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests"", 
     ""Status"": 300, 
     ""Url"": ""http://www.yahoo.com"" 
     }, 
     { 
     ""$type"": ""Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests"", 
     ""Status"": 200, 
     ""Url"": ""http://www.askjeeves.com"" 
     } 
    ] 
    } 
}", json); 

     object c = JsonConvert.DeserializeObject(json, new JsonSerializerSettings 
     { 
     TypeNameHandling = TypeNameHandling.All, 
     TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
     }); 

     Assert.IsInstanceOfType(typeof(Dictionary<string, object>), c); 

     Dictionary<string, object> newCollection = (Dictionary<string, object>)c; 
     Assert.AreEqual(3, newCollection.Count); 
     Assert.AreEqual(@"http://www.bing.com", ((UrlStatus)newCollection["First"]).Url); 

     List<UrlStatus> statues = (List<UrlStatus>) newCollection["List"]; 
     Assert.AreEqual(2, statues.Count); 
    } 
    } 

Düzenleme, bir listeden bahsettiğinizi fark ettim. TypeNameHandling, All olarak ayarlanmalıdır.

Belgeleme: Ben bile zip indirilen Yayın 8. Json.NET 3.5 kullanıyorum TypeNameHandling setting

+1

yine emin olmak için. –

+0

Sadece en son yapı 53965'i ​​denedim, hala işe yaramadı. –

+6

TypeNameHandling = TypeNameHandling.All hile oldu. –

İlgili konular