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
相关产品推荐
相关产品推荐

