反序列化 NodaTime LocalDate 时出现异常

Ahm*_*man 3 c# serialization json nodatime

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

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

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

我看到这个异常消息:

NodaTime.Utility.InvalidNodaDataException:“解析 LocalDate 时出现意外标记。需要字符串,得到 StartObject。'

这是 MyObject 类:

class MyObject
{
    public LocalDate Date { get; set; }
    public string AnotherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试反序列化的 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"
}
Run Code Online (Sandbox Code Playgroud)

Ahm*_*man 6

我现在已经弄清楚了 - 我的问题是我在 ASP.NET 路由处理程序中的错误假设。@LB 的问题实际上让我思考更多。

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

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

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

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

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

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

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

{
    "Date":"2017-07-10",
    "AnotherProperty":"A string"
}
Run Code Online (Sandbox Code Playgroud)

这也是 DeserializeObject 所期望的格式。