gpt4 book ai didi

c# - 反序列化 NodaTime LocalDate 时出现异常

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:48 24 4
gpt4 key购买 nike

我在反序列化包含 JSON 序列化 LocalDate 对象的 JSON 字符串时看到异常(有关 JSON 片段,请参阅此问题的末尾)。

这就是我反序列化的方式:

var settings = new JsonSerializerSettings();
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
var output = JsonConvert.DeserializeObject<MyObject>(json, settings);

我看到这个异常消息:

NodaTime.Utility.InvalidNodaDataException: 'Unexpected token parsing LocalDate. Expected String, got StartObject.'

这是 MyObject 类:

class MyObject
{
public LocalDate Date { get; set; }
public string AnotherProperty { get; set; }
}

这是我要反序列化的 JSON 片段:

{
"Date": {
"Calendar": {
"Id": "ISO",
"Name": "ISO",
"MinYear": -9998,
"MaxYear": 9999,
"Eras": [{
"Name": "BCE"
}, {
"Name": "CE"
}]
},
"Year": 2017,
"Month": 7,
"Day": 10,
"DayOfWeek": 1,
"YearOfEra": 2017,
"Era": {
"Name": "CE"
},
"DayOfYear": 191
},
"AnotherProperty": "A string"
}

最佳答案

我现在想通了 - 我的问题是我在 ASP.NET 路由处理程序中的错误假设。 @L.B 的问题实际上让我多思考了一点。

在此示例中,我假设内置的 JSON 序列化程序正确地序列化了 MyObject 中的 LocalDate:

[HttpGet("myobject")]
public MyObject GetMyObject()
{
return new MyObject()
{
Date = LocalDate.FromDateTime(DateTime.Now),
AnotherProperty = "A string"
};
}

此 API 的结果将与问题中的 JSON 片段相同。

为每个 API 处理程序调用 SerializeObject 并传递 settings 也不是一个好主意,因为我丢失了我拥有的每个路由处理程序的对象返回类型。

为确保 LocalDate每个 处理程序中正确序列化,我在 Startup< 的 ConfigureServices 方法中执行以下操作类:

services.AddMvc().AddJsonOptions(options =>
{
// NodaConverters lives in the NodaTime.Serialization.JsonNet assembly
options.SerializerSettings.Converters.Add(NodaConverters.LocalDateConverter);
});

现在,当我调用上述 API 时,LocalDate 被正确序列化,如下所示:

{
"Date":"2017-07-10",
"AnotherProperty":"A string"
}

这是 DeserializeObject 也期望的格式。

关于c# - 反序列化 NodaTime LocalDate 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45019289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com