У меня есть свойство, которое на самом деле является словарем. И я храню в этом словаре много типов, таких как TimeSpans, DateTimes и т. Д. Но сериализация и десериализация TimeSpans неверны и десериализуется как строка.
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. Но как я могу указать $ type и $ value TimeSpan на уровне сериализации, как это?