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)
我现在已经弄清楚了 - 我的问题是我在 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 所期望的格式。
| 归档时间: |
|
| 查看次数: |
2090 次 |
| 最近记录: |