2016-02-01 8 views
7

JToken'dan ham/orijinal JSON değerini elde etmenin bir yolu var mı?JToken: Ham/orijinal JSON değerini alın

sorun:

var data = JObject.Parse(@"{ 
    ""SimpleDate"":""2012-05-18T00:00:00Z"", 
    ""PatternDate"":""2012-11-07T00:00:00Z"" 
}"); 

var value = data["SimpleDate"].Value<string>(); 

value şimdi 05/18/2012 00:00:00 ama orijinal dize 2012-05-18T00:00:00Z gerekir.

Bu orijinal değeri elde etmenin bir yolu var mı? benim sınıfa parametre olarak geçirilir, çünkü Ayrıca, ben ..., JObject (örn ayarları değiştirme) yaratılır nasıl değiştiremezsin

(Referans: The original NJsonSchema issue)

cevap

7

Orijinal dize alamayan, tarih dizeleri, JsonReader'un kendi içinde DateTime yapısına dönüştürülür ve dönüştürülür. Eğer yaparsanız bunu görebilirsiniz:

Console.WriteLine(((JValue)data["SimpleDate"]).Value.GetType()); // Prints System.DateTime 

Ancak, yaparak ISO 8601 formatında tarihleri ​​çıkarabilir:

var value = JsonConvert.SerializeObject(data["SimpleDate"]); 
// value is "2012-05-18T00:00:00Z" 

Bu işlem her zaman JSON ilgili dize biçiminde bir JValue çıktı. Orijinal tarihleriniz bu formatta olduğundan, ihtiyaçlarınızı karşılayabilir.

(Doğrusu, JObject.ToString() çıktı ISO biçiminde tarihleri ​​içerdiği gelmez göz önüne alındığında, sigara ISO biçiminde sürpriz JValue.ToString() çıkışları tarihleri ​​değilim.)

Eğer JObject okurken ayarlarını değiştirmek mümkün olsaydı, ilgilenir misin JsonSerializerSettings.DateParseHandling = DateParseHandling.None kullanın: Eğer DeserializeObject kullanmak gerekir, böylece bir JsonSerializerSettings alır JObject.Parse() için hiçbir aşırı yük yoktur

 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 

bu. Bu ayar sonunda JsonReader.DateParseHandling'a yayılır.

+0

kötü Yani: Bir JObject alır ve bir düzenli ifade deseni ile böyle bir tarih dizesi doğrulamak olabilir JSON Şema doğrulayıcı, üzerinde çalışıyorum. Bu, değer bir DateTime'a dönüştürüldüğünde artık eşleşmiyor ... –

+0

Belki bir parça [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) sorunu burada olabilir ? Json.NET'in geçerliliğinizdeki tarihi önceden tanımış ve ayrıştırdığı gerçeğinden yararlanabilir misiniz? Sonuçta JSON'da tarihler için standart yok, bkz. Http://www.newtonsoft.com/json/help/html/DatesInJSON.htm. – dbc

+0

Tek seçenek JObject oluştururken tarih ayrıştırma devre dışı bırakmak için ... burada orijinal sorun: https://github.com/NJsonSchema/NJsonSchema/issues/22 –

-2

başka yaklaşım - bu işe yarar - yani işte burada, sadece dize istedi - Regex

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

orası arayıp veri ayıklamak için bir normal ifade kalıptır. JSON ayrıştırma yaklaşımı değildir, ancak gerçekten dizeyi ayıklar.

here is a sample of how it works

+1

Üzgünüm, cevabını anlamıyorum ... –

+0

bir cevaptır - soru "ip" in Json parse ince ayar nasıl değil –