反序列化DateOnly



我有这个记录,我想要反序列化:

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.

谢天谢地,这很清楚问题是什么。

所以,我已经阅读了这个答案和这个GitHub线程。然而,两者似乎都没有给出完整的答案。两者都参考了DateOnlyConverter,但我似乎在框架的任何地方都找不到这个。

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

所以我的问题归结为:

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

如果答案是后者,我会这样做,然后把它作为这个问题的答案发布给未来的读者。

DateOnlyTimeOnly转换器将随。net 7发布。

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

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

相关内容

  • 没有找到相关文章

最新更新