JObject.ToObject ()扩展方法转换存储为字符串的日期时间值

使用字符串属性在JObject上调用ToObject时,转换datetime值。

class Program { static void Main(string[] args) { var a = JObject.Parse("{\"aprop\":\"2012-12-02T23:03:31Z\"}"); var jobject = a.ToObject(); Console.ReadKey(); } } public class A { public string AProp { get; set; } } 

问题是,尽管它是一个字符串,我仍然可以改变我的价值。 跳过了ISO8601特定字符:

在此处输入图像描述

我希望不会发生任何转变,并且希望能够自己进行日期validation和特定于文化的创建。 我也尝试了下一个代码没有成功:

 var jobject = a.ToObject(new JsonSerializer { DateParseHandling = DateParseHandling.None }); 

例如,为了介绍JObject.Parse 。 在我的实际任务中,我在控制器上有一个Web.Api动作:

 public HttpResponseMessage Put(JObject[] requestData) { var jobject = a.ToObject(); return SomeCleverStaffResponse(); } 

你想要的是什么

 using Newtonsoft.Json; class Program { static void Main(string[] args) { var temp = JsonConvert.DeserializeObject("{\"aprop\":\"2012-12-02T23:03:31Z\"}"); Console.ReadKey(); } } 

一旦你做Parse因为“2012-12-02T23:03:31Z”是一个日期,解析器创建一个Date对象之后所有内容都已经解析了对象,所以.ToObject是无用的,因为你正在做的是从日期到字符串,这就是你得到“12 / ……”的原因。

当你不想在第一时间解析它时,你为什么解析它? 没有理由构建JObject实例。 只需使用JsonSerializer.Deserialize方法将字符串反序列化为A实例。 然后,您可以利用所有Json.NET的属性(以及其他方法)来控制反序列化。