我有这个记录,我想要反序列化:
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
已经存在的东西,还是我要实现它自己?
如果答案是后者,我会这样做,然后把它作为这个问题的答案发布给未来的读者。
DateOnly
和TimeOnly
转换器将随。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