首页 > 解决方案 > 有没有办法在这个 JSONPath 查询的结果中保留时区信息?

问题描述

我正在使用 JSONPath 查询(和 NewtonSoft.Json.Linq)从用户提供的 JSON 中提取属性,但我遇到了 JSON“日期”类型的问题。

示例代码(可以在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

我知道这些时间对于当地时区是正确的。但如果可能的话,我想找到一种方法来保留原始时间和偏移值。

标签: c#json.netjsonpath

解决方案


问题是默认情况下,序列化程序设置DateParseHandlingDateParseHandling.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

推荐阅读