私は実際には辞書であるプロパティを持っています。そして、私は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としてそれをdesrializeする可能性があります。しかし、このようにシリアル化レベルでTimeSpanの$typeと$valueを指定するにはどうすればよいですか?