我试图采取像这样结构的对象
原文链接:/json/443133.htmlpublic class Item { public Guid SourceTypeID {get;set;} public Guid BrokerID {get;set;} public double Latitude {get;set;} public double Longitude {get;set;} public DateTime TimeStamp {get;set;} public object Payload {get;set;} }
并使用以下调用使用JSON.NET对其进行序列化:
Item expected = new Item() { SourceTypeID = Guid.NewGuid(),BrokerID = Guid.NewGuid(),Latitude = 33.657145,Longitude = -117.766684,TimeStamp = DateTime.Now,Payload = new byte[]{ 0,1,2,3,4,5,6,7,8,9 } }; string jsonString = JsonConvert.SerializeObject(expected);
Item对象的有效负载成员可能会保存C#原语列表中的任何一个原语(加上Guid之类的其他几个),或者这些类型的数组(如示例中的字节数组)或“flat”由任何先前列出的“基元”(动态创建)组成的对象.
当我执行SerializeObject()调用时,生成的字符串包含:
{"Payload":"AAECAwQFBgcICQ==","SourceTypeID":"d8220a4b-75b1-4b7a-8112-b7bdae956a45","BrokerID":"951663c4-924e-4c86-a57a-7ed737501dbd","TimeStamp":"\/Date(1328202421559-0600)\/","Latitude":33.657145,"Longitude":-117.766684}
Item actual = JsonConvert.DeserializeObject<Item>(jsonString); actual.SourceTypeID : {00000000-0000-0000-0000-000000000000} actual.BrokerID : {951663c4-924e-4c86-a57a-7ed737501dbd} actual.Latitude : 33.657145; actual.Longitude : -117.766684; actual.TimeStamp : {2/2/2012 11:07:01 AM} actual.Payload : null
SourceTypeID成员(Guid)和Payload成员(对象,持有byte [])都是不正确的.序列化字符串似乎保持guid的正确标识,但不适用于字节数组.
我看到SerializeObject的替代签名是
SerializeObject(object value,params JsonConverter[] converters);
这是通知de / serialization引擎它显然处理错误的类型的正确方法吗?由于我正在使用一组有限的“原语”作为我的对象的核心,如果我可以为每种类型创建一组转换器,那会解决我的问题吗?
如果可能的话,我想避免重新发明轮子,因为这似乎是一个已经优雅处理的问题,并且我想利用这样的东西(如果可用的话).