2016-02-01 22 views
7

C'è un modo per ottenere il valore JSON raw/originale da un JToken?JToken: ottieni il valore JSON raw/originale

Il problema:

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

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

Il value è ora 05/18/2012 00:00:00 ma ho bisogno la stringa originale 2012-05-18T00:00:00Z.

C'è un modo per ottenere questo valore originale? Inoltre, non posso cambiare il modo in cui viene creata la JObject (ad esempio, modificare le impostazioni), perché è passato come parametro nella mia classe ...

(Riferimento: The original NJsonSchema issue)

risposta

7

Non è possibile ottenere la stringa originale, le stringhe di data vengono riconosciute e convertite in strutture DateTime all'interno dello stesso JsonReader. Si può vedere questo se si fa:

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

È possibile, tuttavia, estrarre le date in formato ISO 8601 facendo:

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

Questo emetterà sempre un JValue in un formato stringa JSON-appropriata. Poiché le date originali sono in questo formato, questo potrebbe soddisfare le tue esigenze.

(Onestamente, io sono JValue.ToString() uscite sorpreso date in formato non-ISO, dato che JObject.ToString() vuol uscita contenuta date in formato ISO.)

Se tu fossi in grado di modificare le impostazioni durante la lettura JObject, si potrebbe utilizzare 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 

non c'è sovraccarico JObject.Parse() che prende un JsonSerializerSettings, quindi si avrebbe bisogno di utilizzare DeserializeObject. Questa impostazione alla fine viene propagata a JsonReader.DateParseHandling.

+0

Questo è male: sto lavorando su un validatore JSON Schema, che prende un jobject e può convalidare un tale stringa data con un modello di espressione regolare. Ciò non corrisponde più quando il valore viene convertito in un DateTime ... –

+0

Forse un po 'di [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) problema qui ? Potresti sfruttare il fatto che Json.NET ha già riconosciuto e analizzato la data nel tuo validatore? Dopotutto, non esiste uno standard per le date in JSON, vedere http://www.newtonsoft.com/json/help/html/DatesInJSON.htm. – dbc

+0

Sembra che l'unica opzione sia disabilitare l'analisi della data durante la creazione del JObject ... qui il problema originale: https://github.com/NJsonSchema/NJsonSchema/issues/22 –

-2

un altro approccio - che avrebbe funzionato - Regex

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

si tratta di un modello di espressione regolare per estrarre i dati che si cerchi - si voleva solo la stringa, ecco che è. non è l'approccio di analisi JSON, ma estrae effettivamente la stringa.

here is a sample of how it works

+1

Mi spiace, non capisco la tua risposta ... –

+0

è una risposta - la domanda era estrarre la "stringa" non come mettere a punto l'analisi di Json –