2013-06-02 4 views
2

J'ai un struct pour convertir un ASP.NET DateTime en temps unix comme ceci:sur mesure JSON Encode struct

public struct UnixDateTime 
{ 
    private readonly int _value; 

    public UnixDateTime(int value) 
    { 
     this._value = value; 
    } 

    public static implicit operator UnixDateTime(DateTime dateTime) 
    { 
     DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
     return new UnixDateTime((int)(dateTime - epoch).TotalSeconds); 
    } 

    public static implicit operator DateTime(UnixDateTime unixDateTime) 
    { 
     return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(unixDateTime); 
    } 

    public static implicit operator int(UnixDateTime unixDateTime) 
    { 
     return unixDateTime._value; 
    } 

    public static implicit operator string(UnixDateTime unixDateTime) 
    { 
     return unixDateTime._value.ToString(); 
    } 
} 

Untested, s'il vous plaît n'utiliser que dans leur code sans le tester.

Quoi qu'il en soit, quand je stocke cette valeur dans un ViewModel, l'envoyer à la vue, puis appelez:

@Html.Raw(Json.Encode(Model)) 

Il sortira un objet vide « {} » pour cette propriété.

Quelles méthodes dois-je ajouter à ma structure pour que Json.Encode génère correctement une valeur entière? De préférence, je voudrais à pas émettre un « objet », mais plutôt une « valeur » ... donc je ne veux pas:

"Date": {"Value": 123456} 

Mais plutôt:

"Date": 123456 

Je sais Je peux juste ajouter un getter sur la structure pour l'amener à sortir comme ce que je ne veux pas, mais j'aimerais que cela fonctionne de la même façon que les types string ou int fonctionnent. Peut-être que ce n'est pas possible sans refaire complètement Json.Encode?

Merci!

Répondre

2

Je suis ce travail, si vous connaissez un moyen de le faire sans JSON.net, alors laissez-moi savoir:

  1. Utilisez Json.net
  2. Créer la classe suivante:

    class UnixDateJsonConverter : JsonConverter 
    { 
        public override bool CanConvert(Type objectType) 
        { 
         return (objectType == typeof(UnixDateTime)); 
        } 
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
        { 
         // I'll figure this out later 
         throw new NotImplementedException(); 
        } 
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
        { 
         if (value == null) 
         { 
          serializer.Serialize(writer, null); 
          return; 
         } 
    
         UnixDateTime dt = (UnixDateTime)value; 
         serializer.Serialize(writer, (int) dt); 
        } 
    } 
    
  3. Ajoutez [JsonConverter(typeof(UnixDateJsonConverter))] au-dessus de la structure UnixDateTime.

  4. Utilisez Newtonsoft.Json.JsonConvert.SerializeObject au lieu de Json.Encode pour le transformer en json.

Si quelqu'un connaît une meilleure façon de le faire sans json.net je vais vous donner la réponse. Json.net était déjà dans mon projet, donc ça a marché.