2016-02-01 2 views
7

Есть ли способ получить исходное/исходное значение JSON от JToken?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 создается (например, изменение параметров), так как он передается в качестве параметра в мой класс ...

(Справка: The original NJsonSchema issue)

ответ

7

Вы не можете получить исходную строку, строки даты распознаются и преобразуются в DateTime структур внутри самого JsonReader. Вы можете увидеть это, если вы делаете:

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" 

Это будет всегда выводится JValue в формате строки JSON-соответствующий. Поскольку ваши исходные даты в этом формате, это может удовлетворить ваши потребности.

(Честно говоря, я удивлен 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.

+0

Это плохо: Я работаю на валидатор JSON Schema, который принимает JObject и может подтвердить такую ​​строку даты с шаблоном регулярного выражения. Это больше не совпадает, когда значение преобразуется в DateTime ... –

+0

Возможно, проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) здесь ? Не могли бы вы использовать тот факт, что Json.NET уже распознал и проанализировал дату в вашем валидаторе? В JSON нет стандарта для дат, см. Http://www.newtonsoft.com/json/help/html/DatesInJSON.htm. – dbc

+0

Кажется, что единственный вариант - отключить синтаксический анализ даты при создании объекта JObject ... здесь исходная проблема: https://github.com/NJsonSchema/NJsonSchema/issues/22 –

-2

другой подход - это будет работать - Regex

SimpleDate(?:.*):(?:.*?)\"([0-9|-]{1,}T[0-9|:]+Z) 

это шаблон регулярного выражения для извлечения данных, которые вы искать - вы просто хотели строку, так вот она. это не подход JSON-анализа, но он действительно извлекает строку.

here is a sample of how it works

+1

Извините, я не понимаю вашего ответа ... –

+0

это ответ - вопрос состоял в том, чтобы извлечь «строку», а не как точно настроить Json parse –

Смежные вопросы