DataContractJsonSerializer - Désérialisation DateTime dans la Liste des<object>
J'ai de la difficulté à l'aide de la System.Moment de l'exécution.La sérialisation.Json.DataContractJsonSerializer
classe pour désérialiser DateTime les instances contenues dans un List<object>
. Je ne peux pas sembler obtenir DateTime pour désérialiser de retour dans le type d'origine. Le DataContractJsonSerializer
toujours désérialise dans un type de chaîne avec le format "/Date(1329159196126-0500)/"
. Il va sérialiser et désérialiser des beaux-si je le lance par le biais de l'aide d'un typage fort List<DateTime>
, cependant, je suis à la recherche de façon à obtenir le sérialiseur, d'identifier et désérialiser DateTimes lorsque rencontrées à l'intérieur d'une simple liste ou d'une matrice de object
.
Noter que DateTimes sont le seul type en dehors des primitives et des cordes que cette liste ne pourra jamais contenir.
Voici l'extrait de code que j'utilise pour tester cela.
var list = new List<object> { 27, "foo bar", 12.34m, true, DateTime.Now };
var serializer = new DataContractJsonSerializer(typeof (List<object>));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, list);
ms.Position = 0;
var deserializedList = serializer.ReadObject(ms) as List<object>;
}
OriginalL'auteur Matthew Ruston | 2012-02-13
Vous devez vous connecter pour publier un commentaire.
Cela semble être un comportement très étrange, je suppose qu'il provient de DateTime n'étant pas un type qui se succèdent dans le temps en JSON. Cependant, vous pouvez rouler vos propres IDataContractSurrogate de modifier la sérialisation/désérialisation processus.
Pour utiliser cette modifier votre code d'exemple, lorsque vous créez le sérialiseur:
Puis ajouter cette classe:
Afin de soutenir les dates avant 1970 votre regex doit être
/Date\((-?\d+)([-+])(\d+)\)/)
OriginalL'auteur Mike Zboray
Dans le .NET Framework version 4.5 de la
DataContractJsonSerializer
a un constructeur qui accepte unDataContractJsonSerializerSettings
de l'objet qui peut être utilisé pour définir leDateTimeFormat
:DateTime
n'est pas à l'UTC en premier lieu: il aura la valeur de l'heure locale, mais avec leZ
représentant UTC (donc être interprété à la lecture de côté). Il est probablement préférable d'utiliseryyyy-MM-dd'T'HH:mm:ssK
à la place.Je suis d'accord, l'utilisation
yyyy-MM-dd'T'HH:mm:ssK
ouyyyy-MM-dd'T'HH:mm:sszzz
. N'utilisez pas deyyyy-MM-dd'T'HH:mm:ssZ
.OriginalL'auteur David Clarke
Si
DataContractJsonSerializer
n'est pas un doit, voici une solution à l'aide de Json.Net.C'est la chaîne Json
et retourné types sont
long
,string
,double
,bool
etDateTime
OriginalL'auteur L.B
Vous pouvez convertir date /heure.Maintenant à une chaîne de caractères avant de sérialisation et
reconvertir DateTime après la désérialisation.
Conversion en chaîne par:
De Conversion vers DateTime après la désérialisation:
Donc tout le code serait:
OriginalL'auteur brgerner