2011-10-24 2 views

Répondre

1

par les notes de MDSN sur JavaScriptSerializer:

objet Date, représentée en JSON comme "/ Date (nombre de tiques) /". Le nombre de ticks est une valeur longue positive ou négative qui indique le nombre de ticks (millisecondes) qui se sont écoulés depuis minuit le 01 janvier 1970 UTC.

La valeur de date prise en charge maximale est MaxValue (12/31/9999 23:59:59 PM) et la valeur de date prise en charge minimale est MinValue (1/1/0001 12:00:00 AM).

Vous devez enregistrer un JavaScriptConverter pour DateTime qui gère votre type:

public class DateTimeConverter : JavaScriptConverter 
{ 

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     if (dictionary == null) 
      throw new ArgumentNullException("dictionary"); 

     if (type == typeof(DateTime)) 
     { 
      DateTime time; 
      time = DateTime.Parse(dictionary["Time"].ToString(), /** put your culture info here **/); 

      return time; 
     } 

     return null; 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     DateTime? time = obj as DateTime?; 

     if (time == null) 
     { 
      Dictionary<string, object> result = new Dictionary<string, object>(); 
      result["Time"] = time.Value; 

      return result; 
     } 

     return new Dictionary<string, object>(); 
    } 

    public override IEnumerable<Type> SupportedTypes 
    { 
     get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(DateTime) })); } 
    } 
} 

Gardez à l'esprit que vous aurez besoin de rendre compte de ce que votre JSON aura effectivement en termes de noms de propriétés d'objet (vous utilisez probablement un nom autre que "Time").

Inscrivez-vous sur votre JavaScriptSerializer:

serializer.RegisterConverters(new List<JavaScriptConverter>() { new DateTimeConverter() }); 

Enfin, notez qu'il ya plus qui peut être fait, et cela est seulement un exemple pour construire. Explicitement, il recherche des éléments de dictionnaire avec le nom "Time" et ne gère pas les échecs d'analyse. Vous pouvez avoir plus qu'un seul nom pour les champs utilisant DateTime.

+0

Merci pour la réponse! 2 questions: Est-il possible que le résultat sérialisé soit toujours représenté par un type primitif? C'est à dire. ne pas l'avoir enveloppé dans un autre objet avec la propriété Time? En outre, connaissez-vous un moyen pour les convertisseurs de gérer tous les types dérivés de la propriété SupportedTypes? Je demande parce que je voudrais également utiliser cette fonctionnalité pour sérialiser une interface particulière d'une certaine manière. –

+0

Je ne suis pas sûr de la réponse à votre première question. Pour tout type que vous souhaitez gérer spécialement, vous devrez créer un convertisseur pour celui-ci, et l'enregistrer comme ci-dessus. – doctorless

Questions connexes