gpt4 book ai didi

object - 使用 Json.NET 序列化 Dictionary 中的时间跨度

转载 作者:行者123 更新时间:2023-12-02 05:18:02 25 4
gpt4 key购买 nike

我有一个实际上是字典的属性。我在这个字典中保留了许多类型,如 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();

结果: Types of the objects

因此对象中的 TimeSpan 无法反序列化为时间跨度。我也尝试过使用最新版本的 Json.Net。但结果是一样的。

如何为 TimeSpan 指定类型名称?或者我应该编写自定义转换器以及如何编写?

编辑:

我做了一些测试,并像这样更改了序列化的 timeSpan 属性:

""timeSpan"": {
""$type"": ""System.TimeSpan"",
""$value"": ""01:01:01""}

这次 json.net 可以将其反序列化为 TimeSpan。但是我如何在这样的序列化级别指定 TimeSpan 的 $type 和 $value 呢?

最佳答案

我终于找到了解决方案。我为 TimeSpan 编写了自定义转换器。但我认为 Json.Net 中存在错误。因为我不会为像 TimeSpan 这样的原始类型编写转换器。无论如何,这是解决方案:

public class TimeSpanConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(TimeSpan);
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("$type");
writer.WriteValue(value.GetType().FullName);
writer.WritePropertyName("$value");
writer.WriteValue(value);
writer.WriteEndObject();
}

public override object ReadJson(JsonReader reader, Type type, object value, JsonSerializer serializer)
{
return value;
}
}

另外不要忘记将此转换器添加到 json 序列化程序设置中。如果有任何更好的解决方案,我们将不胜感激。

关于object - 使用 Json.NET 序列化 Dictionary<string, object> 中的时间跨度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14316637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com