我在整个项目中使用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转换为即时。在MyObject内部,我有DateTimes,如果我试图将它更改为Instant,我会得到以下错误:
Newtonsoft.Json.JsonSerializationException‘在Newtonsoft.Json.dll附加信息:将值2016/07/07 12:00上午12:00转换为'NodaTime.Instant’的错误。路径'date',第4行,位置37
我有没有办法将我的JSON文件反序列化到我的强类型的MyObject中,我的日期直接反序列化到即时,而不是必须转换一个DateTime?
发布于 2016-07-20 18:59:50
根据野田时间用户指南
ConfigureForNodaTime上调用JsonSerializerSettings如果你还能得到“意料之外的记号.”消息,则可能更改了DateParseHandling设置。ConfigureForNodaTime调用将此设置为DateParseHandling.None,并且应该保持这种方式。
注意,这对于JsonConvert.SerializeObject和JsonConvert.DeserializeObject类很好,因为它们接受一个JsonSettings参数,这个参数也可以通过JsonConvert.DefaultSettings设置。下面是一个使用这种方法的现场演示。
但是,如果您使用的是JObject API,那么有一个小问题。JObject.Parse不具备接受设置参数的能力,默认情况下,您将没有现阶段需要的DateParseHandling.None。解决这一问题的方法包括使用JsonTextReader,并详细描述了在这个StackOverflow答案中。
https://stackoverflow.com/questions/38486537
复制相似问题