使用JSON.NET在C#中进行不正确的序列化

前端之家收集整理的这篇文章主要介绍了使用JSON.NET在C#中进行不正确的序列化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图采取像这样结构的对象
public 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引擎它显然处理错误的类型的正确方法吗?由于我正在使用一组有限的“原语”作为我的对象的核心,如果我可以为每种类型创建一组转换器,那会解决我的问题吗?

如果可能的话,我想避免重新发明轮子,因为这似乎是一个已经优雅处理的问题,并且我想利用这样的东西(如果可用的话).

这似乎是JSON.NET中的一个实际错误.

这不是主意,但解决方法可能是进行两阶段序列化.第一个,实际上与JSON序列化的对象,只包含字符串类型的字段/属性.第二个对象(服务器端代码将使用的对象)将是一个手动转换为强类型的对象.

不理想,但可能.另外,您可以考虑使用DataContractJsonSerializer,它可以很好地处理字节数组和指导IME.日期仍然非常糟糕,但这主要是Javascript的错误.

猜你在找的Json相关文章