我在整个项目中使用NodaTime作为标准BCL DateTime类的替代品,效果惊人。
我想完全从我的项目中消除DateTime。我只在一个地方使用它 - 我反序列化包含日期的大型JSON文件。这些日期始终 UTC且始终以ISO 8601格式指定。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Schema;
namespace Foo.Parsing
{
public class Parser
{
JSchema schema;
JObject jsonObject;
public Parser(string jsonContent, string schemaString)
{
schema = JSchema.Parse(schemaString);
jsonObject = JObject.Parse(jsonContent);
}
public MyObject Parse()
{
return jsonObject.ToObject<MyObject>();
}
}
public class MyObject
{
[JsonProperty(Required = Required.Always)]
public DateTime date { get; set; }
// A lot of other properties here.
}
}
这一切都非常有效,但目前我必须使用Instant.FromDateTimeUtc(myObject.date);
将DateTimes转换为Instant。在MyObject内部我有DateTimes,如果我尝试将其更改为Instant,我会收到以下错误:
Newtonsoft.Json.dll中的Newtonsoft.Json.JsonSerializationException' 其他信息:将值2016/07/07 12:00:00 AM转换为'NodaTime.Instant'时出错。路径'日期',第4行,第37位
我有没有办法将我的JSON文件反序列化为强类型的MyObject,我的日期直接反序列化为Instant而不必转换DateTime?
答案 0 :(得分:3)
ConfigureForNodaTime
JsonSerializerSettings
如果您仍然收到“意外令牌...”消息,那么您可能已更改了DateParseHandling
设置。 ConfigureForNodaTime
调用会将此设置为DateParseHandling.None
,并且应该保持这种状态。
请注意,这适用于JsonConvert.SerializeObject
和JsonConvert.DeserializeObject
类,因为它们接受JsonSettings
参数,也可以通过JsonConvert.DefaultSettings
设置。 Here is a live demo using this approach
但是,如果您使用的是JObject
API,则会出现一个小问题。 JObject.Parse
无法获取设置参数,默认情况下,您不会拥有此阶段所需的DateParseHandling.None
。对此的解决方案涉及使用JsonTextReader
,并且描述得很好in this StackOverflow answer。