You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Json.NET无法将ISO 8601时间转换为NodaTime Instant问题求助

问题根因

你代码里的Foo类的Time属性是只读无构造函数赋值的状态:Json.NET默认不会给没有setter、也没有对应构造函数参数初始化的属性赋值,所以Time属性最终保留了Instant类型的默认值,也就是Unix纪元起点1970-01-01T00:00:00Z,和NodaTime的序列化配置本身没有关系。

解决方案

以下3种方案选任意一种即可落地:

方案1:给属性添加setter

改动最小的方案,直接给Time属性添加公开setter:

class Foo
{
    [JsonProperty("time")]
    public Instant Time { get; set; }
}

方案2:新增带参数的构造函数

如果需要保留属性只读的特性,给Foo补充对应参数的构造函数即可,Json.NET会自动匹配构造参数名和JSON字段名完成赋值:

class Foo
{
    [JsonProperty("time")]
    public Instant Time { get; }

    // 构造参数名和JSON字段名保持一致(不区分大小写)
    public Foo(Instant time)
    {
        Time = time;
    }
}

方案3:通过JsonProperty配置强制反序列化只读属性

在JsonProperty特性上加Required = Required.Always,强制Json.NET给只读属性赋值:

class Foo
{
    [JsonProperty("time", Required = Required.Always)]
    public Instant Time { get; }
}

内容的提问来源于stack exchange,提问作者jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:39:03