有没有办法从JToken
获取原始/原始JSON值?
问题:
var data = JObject.Parse(@"{
""SimpleDate"":""2012-05-18T00:00:00Z"",
""PatternDate"":""2012-11-07T00:00:00Z""
}");
var value = data["SimpleDate"].Value<string>();
value
现在是05/18/2012 00:00:00
,但我需要原始字符串2012-05-18T00:00:00Z
。
有没有办法获得这个原始价值?此外,我无法更改JObject
的创建方式(例如更改设置),因为它作为参数传递到我的班级......
答案 0 :(得分:10)
您无法获取原始字符串,日期字符串会被识别并转换为JsonReader
内部的DateTime
结构。如果你这样做,你可以看到:
Console.WriteLine(((JValue)data["SimpleDate"]).Value.GetType()); // Prints System.DateTime
但是,您可以通过以下方式提取ISO 8601格式的日期:
var value = JsonConvert.SerializeObject(data["SimpleDate"]);
// value is "2012-05-18T00:00:00Z"
这将始终以适合JSON的字符串格式输出JValue
。由于您的原始日期采用此格式,因此可能符合您的需求。
(老实说,我很惊讶JValue.ToString()
以非ISO格式输出日期,因为JObject.ToString()
的输出包含ISO格式的日期。)
如果您在阅读JObject
时可以更改设置,则可以使用JsonSerializerSettings.DateParseHandling = DateParseHandling.None
:
var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None };
var data = JsonConvert.DeserializeObject<JObject>(@"{
""SimpleDate"":""2012-05-18T00:00:00Z"",
""PatternDate"":""2012-11-07T00:00:00Z""
}", settings);
var value = data["SimpleDate"].Value<string>();
Debug.WriteLine(value); // Outputs 2012-05-18T00:00:00Z
JObject.Parse()
没有超载需要JsonSerializerSettings
,因此您需要使用DeserializeObject
。此设置最终会传播到JsonReader.DateParseHandling
。
答案 1 :(得分:0)
我在Json.NET Disable the deserialization on DateTime中找到了一个解决方案:
JsonReader reader = new JsonTextReader(new StringReader(j1.ToString()));
reader.DateParseHandling = DateParseHandling.None;
JObject o = JObject.Load(reader);
答案 2 :(得分:-3)
另一种方法 - 可行 - Regex
SimpleDate(?:.*):(?:.*?)\"([0-9|-]{1,}T[0-9|:]+Z)
它是一个正则表达式模式,用于提取您查找的数据 - 您只需要字符串,所以就在这里。 它不是JSON解析方法 - 但它确实提取了字符串。