我正在使用JSONPath查询(和NewtonSoft.Json.Linq)从用户提供的JSON中提取属性,并且遇到了JSON“ Date”类型的问题。
示例代码(可在https://dotnetfiddle.net/SqslzX上摆弄:]
string json = "{ \"MyTime\":\"2014-04-20T18:15:11-0700\" }";
var sourceToken = JToken.Parse(json);
var myTimeToken = sourceToken.SelectToken("MyTime");
var myTimeOffset = myTimeToken.ToObject<DateTimeOffset>();
Console.WriteLine(myTimeToken.ToString());
Console.WriteLine(myTimeOffset.ToString());
输出(在.net Fiddle中运行)看起来像:
4/21/2014 1:15:11 AM
4/21/2014 1:15:11 AM +00:00
我知道这些时间对于当地时区是正确的。但我想找到一种方法来保留原始时间和偏移值(如果可能)。
问题是,默认情况下DateParseHandling
的序列化器设置为DateParseHandling.DateTime
。我们需要使用允许自定义序列化程序设置的方法,因此Parse
不会削减它。您可以将DeserializeObject
用作.NET类型,但我猜您没有强类型。这行之有效,仍然可以让您使用LINQ方法:
string json = "{ \"MyTime\":\"2014-04-20T18:15:11-0700\" }";
JsonReader reader = new JsonTextReader(new StringReader(json));
reader.DateParseHandling = DateParseHandling.DateTimeOffset; // this is what we need to change
var sourceObject = JObject.Load(reader);
var myTimeToken = sourceObject.SelectToken("MyTime");
var myTimeOffset = myTimeToken.ToObject<DateTimeOffset>();
Console.WriteLine(myTimeOffset.ToString());
//prints: 4/20/2014 6:15:11 PM -07:00