首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Newtonsoft JToken.ToObject<T>实现deserializeNodaTime即时

用Newtonsoft JToken.ToObject<T>实现deserializeNodaTime即时
EN

Stack Overflow用户
提问于 2016-07-20 16:58:54
回答 1查看 1.6K关注 0票数 2

我在整个项目中使用NodaTime作为标准BCL DateTime类的替代品,取得了惊人的效果。

我想把DateTime完全从我的项目中驱逐出去。我只在一个地方使用它--在其中反序列化包含日期的大型JSON文件。这些日期总是UTC,并且总是以ISO 8601格式指定。

代码语言:javascript
复制
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转换为即时。在MyObject内部,我有DateTimes,如果我试图将它更改为Instant,我会得到以下错误:

Newtonsoft.Json.JsonSerializationException‘在Newtonsoft.Json.dll附加信息:将值2016/07/07 12:00上午12:00转换为'NodaTime.Instant’的错误。路径'date',第4行,位置37

我有没有办法将我的JSON文件反序列化到我的强类型的MyObject中,我的日期直接反序列化到即时,而不是必须转换一个DateTime?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-20 18:59:50

根据野田时间用户指南

如果你还能得到“意料之外的记号.”消息,则可能更改了DateParseHandling设置。ConfigureForNodaTime调用将此设置为DateParseHandling.None,并且应该保持这种方式。

注意,这对于JsonConvert.SerializeObjectJsonConvert.DeserializeObject类很好,因为它们接受一个JsonSettings参数,这个参数也可以通过JsonConvert.DefaultSettings设置。下面是一个使用这种方法的现场演示

但是,如果您使用的是JObject API,那么有一个小问题。JObject.Parse不具备接受设置参数的能力,默认情况下,您将没有现阶段需要的DateParseHandling.None。解决这一问题的方法包括使用JsonTextReader,并详细描述了在这个StackOverflow答案中

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38486537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档