使用Newtonsoft JToken.ToObject <t>反序列化NodaTime Instant

时间:2016-07-20 16:58:54

标签: c# json json.net deserialization nodatime

我在整个项目中使用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?

1 个答案:

答案 0 :(得分:3)

根据Noda Time User Guide

如果您仍然收到“意外令牌...”消息,那么您可能已更改了DateParseHandling设置。 ConfigureForNodaTime调用会将此设置为DateParseHandling.None,并且应该保持这种状态。

请注意,这适用于JsonConvert.SerializeObjectJsonConvert.DeserializeObject类,因为它们接受JsonSettings参数,也可以通过JsonConvert.DefaultSettings设置。 Here is a live demo using this approach

但是,如果您使用的是JObject API,则会出现一个小问题。 JObject.Parse无法获取设置参数,默认情况下,您不会拥有此阶段所需的DateParseHandling.None。对此的解决方案涉及使用JsonTextReader,并且描述得很好in this StackOverflow answer