2016-06-20 7 views
4

Angenommen, ich habe einen Typ, dessen Wert vollständig durch eine Ganzzahl dargestellt werden kann, aber über eine Validierungslogik verfügt, die in der Web-API zurückgegeben und akzeptiert wird. Im Einklang mit gutem Code und primitive Besessenheit zu vermeiden, könnte ich so etwas wie:Optimieren und vereinfachen Sie die DataContract-Serialisierung für sehr einfache Klassen?

public class FiscalPeriod 
{ 
    public FiscalPeriod(int id) 
    { 
     if (!Validator.IsValidPeriod(id)) 
      throw new ArgumentException($"Invalid fiscal period ID '{id}'", nameof(id)); 
     Id = id; 
    } 

    public int Id { get; private set; } 
    public override string ToString() => Id.ToString(); 
    public static implicit operator int(FiscalPeriod period) => period.Id; 
} 

Dann, wenn diese Art von einem Web-API-Aufruf zurückgegeben wird, wird es in JSON serialisiert als:

"FiscalPeriod" : {"Id": 201601}, 

Gibt es stattdessen eine Möglichkeit, es zu serialisieren, um das Folgende zu erzwingen?

"FiscalPeriod" : 201601, 

also, dass sie mehr sein kann als eine einfache Zahl auf der Client-Seite leicht zu handhaben?

+1

Meinen Sie 'Validator.IsNotValidPeriod (id)'? –

+0

Korrigiert. Vielen Dank. –

+0

http://blog.maskalik.com/asp-net/json-net-implement-custom-serialization/ – dotctor

Antwort

4

Sie können Json.Net mitteilen, wie Sie mit dem Typ mithilfe des JsonConverter-Attributs umgehen.

public class ViewModel 
{ 
    public FiscalPeriod FiscalPeriod { get; set; } 
} 

public class FiscalPeriodConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var fiscalPeriod = value as FiscalPeriod; 
     writer.WriteStartObject(); 
     serializer.Serialize(writer, fiscalPeriod.Id); 
     writer.WriteEndObject(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(FiscalPeriod).IsAssignableFrom(objectType); 
    } 
} 

[JsonConverter(typeof(FiscalPeriodConverter))] 
public class FiscalPeriod 
{ 
    public FiscalPeriod(int id) 
    { 
     if (!Validator.IsValidPeriod(id)) 
      throw new ArgumentException($"Invalid fiscal period ID '{id}'", nameof(id)); 
     Id = id; 
    } 

    public int Id { get; private set; } 
    public override string ToString() => Id.ToString(); 
    public static implicit operator int(FiscalPeriod period) => period.Id; 
} 

http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonConverterAttribute.htm