我有一个实际上是字典的属性。而且我在这本字典中保留了许多类型,例如 TimeSpan、DateTimes 等。但是序列化和反序列化 TimeSpan 是错误的,它会反序列化为字符串。
var dict = new Dictionary<string, object>();
dict.Add("int", 15);
dict.Add("string", "foo");
dict.Add("timeSpan", new TimeSpan(1,1,1));
dict.Add("dateTime", DateTime.Now);
var settings = new JsonSerializerSettings{
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
};
var serializedObj = JsonConvert.SerializeObject(dict, Newtonsoft.Json.Formatting.Indented, settings);
var deserializedObj = (Dictionary<string, object>)JsonConvert.DeserializeObject(serializedObj, settings);
//Displaying the types with LinqPad:
deserializedObj["int"].GetType().Dump();
deserializedObj["string"].GetType().Dump();
deserializedObj["timeSpan"].GetType().Dump();
deserializedObj["dateTime"].GetType().Dump();
结果:
所以对象中的 TimeSpan 不能反序列化为时间跨度。我也尝试过使用最新版本的 Json.Net。但结果是一样的。
如何为 TimeSpan 指定类型名称?或者我应该编写一个自定义转换器以及如何编写?
编辑:
我做了一些测试,并像这样更改了序列化的 timeSpan 属性:
""timeSpan"": {
""$type"": ""System.TimeSpan"",
""$value"": ""01:01:01""}
而这一次 json.net 可以将其反序列化为 TimeSpan。但是我怎样才能像这样在序列化级别指定 TimeSpan 的 $type 和 $value 呢?