2017-10-19 8 views
3

J'ai une chaîne de json et besoin de convertir en JObject.Comment analyser chaîne à JObject en ignorant fuseau horaire

Exemple:

String result = ""{"totalSize":1,"done":true,"records":[{"attributes":{"type":"Municipio__c","url":"/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE"},"Id":"a0V2C000000gIgzUAE","LastModifiedDate":"2017-08-01T18:12:04.000+0000"}]}";" 

var json = JObject.Parse(result); 

Mais au moment de la convertion, le LastModifiedDate a changé la valeur de mon temps Zone.

Comme ça:

{{ 
    "totalSize": 1, 
    "done": true, 
    "records": [ 
    { 
     "attributes": { 
     "type": "Municipio__c", 
     "url": "/services/data/v37.0/sobjects/Municipio__c/a0V2C000000gIgzUAE" 
     }, 
     "Id": "a0V2C000000gIgzUAE", 
     "LastModifiedDate": "2017-08-01T15:12:04-03:00" 
    } 
    ] 
}} 

L'heure a changé: 18:12:04 (hh: mm: ss) à 15:12:04 (hh: mm: ss).

Y at-il un moyen d'ignorer le fuseau horaire sur le parse?

+1

cela me semble étrange, êtes-vous sûr que tout est? –

+0

Oui. C'est une fonctionnalité @MarcoSalerno –

+0

'JObject.Parse' ne modifie pas les chaînes. * Ça ne peut pas *. Les chaînes sont immuables. D'où vient la chaîne modifiée? En outre - le temps n'a pas changé. C'est EXACTEMENT la même chose. –

Répondre

4

Vous devez utiliser JsonConvert avec le DateTimeZoneHandling approprié:

var json = JsonConvert.DeserializeObject 
         (result 
         , new JsonSerializerSettings() 
         { DateTimeZoneHandling = DateTimeZoneHandling.Utc 
         } 
         ); 
+0

Fonctionne comme un charme, merci. – Lnacer

1

Le temps cas sont les mêmes. 18:12:04+00:00 est le même que 15:12:04-03:00 et 21:12:04+03:00 (le décalage actuel en Grèce). Le comportement par défaut lors de l'analyse des valeurs de date est de générer une valeur DateTime locale, c'est-à-dire que sa propriété Kind sera DatTimeKind.Local`. Les autres valeurs DateTimeKind sont UTC et Unspecified.

Cela ne signifie pas que la valeur a changé. Local est un terme relatif cependant - sans connaître le décalage réel, il est facile de mal interpréter. Comme l'explique Patrick Hofman, vous pouvez spécifier que UTC est utilisé en définissant le paramètre DateTimeZoneHandling.

Une meilleure façon est de spécifier que DateTimeOffset sera utilisé à la place de DateTime en utilisant la propriété DateParseHandling = DateParseHandling.DateTimeOffset. Ceci renverra conserver les informations de fuseau horaire d'origine:

var settings=new JsonSerializerSettings{ 
    DateParseHandling = DateParseHandling.DateTimeOffset 
}; 
var json = JsonConvert.DeserializeObject(result, settings); 

Dans ce cas, la valeur sera DateTimeOffset avec le temps original et un décalage de 00:00.

J'utilise dynamic ici pour réduire le bruit casting:

var settings=new JsonSerializerSettings{ 
    DateParseHandling = DateParseHandling.DateTimeOffset 
}; 

dynamic json = JsonConvert.DeserializeObject(result, settings); 
var value=(DateTimeOffset)(json.records[0].LastModifiedDate.Value); 

Console.WriteLine("{0:o}",value); 

Cela retourne:

2017-08-01T18:12:04.0000000+00:00