有没有办法在这个 JSONPath 查询的结果中保留时区信息?
Is there a way to retain the time zone info in the result of this JSONPath query?
我正在使用 JSON 路径查询(和 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());
输出(运行 in .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
我正在使用 JSON 路径查询(和 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());
输出(运行 in .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