gpt4 book ai didi

c# - 反序列化 DateOnly

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

我有这条记录,我正在尝试反序列化:

public record MementoTimeEntry
(
Guid Id,
Guid ActivityId,
string UserId,
string Title,
TimeOnly StartTime,
TimeOnly FinishTime,
DateOnly Start,
DateOnly ActivityDate,
int Hours
);

但是,我得到这个错误:

System.NotSupportedException: Serialization and deserialization of 'System.DateOnly' instances are not supported.

谢天谢地,问题很清楚。

所以,我读过 this answerthis GitHub thread .然而,两者似乎都没有提供完整的答案。两者都引用了 DateOnlyConverter,但我似乎无法在框架中的任何地方找到它。

我以前使用过 [JsonPropertyConverter(typeof(CustomConverter))] 属性来实现类似的事情。

所以我的问题归结为:

这个 DateOnlyConverter 是已经存在的东西,还是我必须自己实现它?

如果答案是后者,我会这样做,然后将其作为该问题的答案发布给 future 的读者。

最佳答案

DateOnlyTimeOnly 转换器将与 .NET 7 一起发布.

现在您可以创建一个看起来像这样的自定义对象(对于 System.Text.Json,对于 Json.NET - 请参阅 this 答案):

public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
private const string Format = "yyyy-MM-dd";

public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateOnly.ParseExact(reader.GetString(), Format, CultureInfo.InvariantCulture);
}

public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString(Format, CultureInfo.InvariantCulture));
}
}

其中一种可能的用法是:

class DateOnlyHolder
{
// or via attribute [JsonConverter(typeof(DateOnlyJsonConverter))]
public DateOnly dt { get; set; }
}

var jsonSerializerOptions = new JsonSerializerOptions
{
Converters = { new DateOnlyJsonConverter() }
};

var serialized = JsonSerializer.Serialize(new DateOnlyHolder{dt = new DateOnly(2022,1,2)}, jsonSerializerOptions);
Console.WriteLine(serialized); // prints {"dt":"2022-01-02"}
var de = JsonSerializer.Deserialize<DateOnlyHolder>(serialized, jsonSerializerOptions);
Console.WriteLine(de.dt); // prints 1/2/2022

关于c# - 反序列化 DateOnly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72984063/

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