首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反序列化DateOnly

反序列化DateOnly
EN

Stack Overflow用户
提问于 2022-07-14 16:50:03
回答 1查看 712关注 0票数 2

我有这样的记录,我正试图反序列化:

代码语言:javascript
复制
public record MementoTimeEntry
(
    Guid Id,
    Guid ActivityId,
    string UserId,
    string Title,
    TimeOnly StartTime,
    TimeOnly FinishTime,
    DateOnly Start,
    DateOnly ActivityDate,
    int Hours
);

但是,我得到了以下错误:

代码语言:javascript
复制
System.NotSupportedException: Serialization and deserialization of 'System.DateOnly' instances are not supported.

谢天谢地,问题是什么,这是非常清楚的。

所以,我读过这个答案这个GitHub线程。然而,两者似乎都没有提供完整的答案。两者都引用了DateOnlyConverter,但我似乎在框架中找不到这一点。

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

所以我的问题归结为:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-14 17:05:19

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

现在,您可以创建一个如下所示的自定义模型(对于System.Text.Json,对于Json.NET -参见答案):

代码语言:javascript
复制
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));
    }
}

其中一个可能的用途是:

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72984063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档