2016-06-20 11 views
4

値が整数で完全に表現できますが、検証ロジックを持ち、Web APIで返されて受け入れられる型があるとします。非常に単純なクラスのDataContractシリアル化を微調整して単純化しますか?

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

:このタイプは、Web APIの呼び出しによって返されたときに、それは次のようにJSONにシリアライズます

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; 
} 

:良いコードを維持し、原始的強迫観念を避けるには、私のような何かをするかもしれません強制的に次のようにシリアル化する方法がありますか?

"FiscalPeriod" : 201601, 

それがより簡単に、クライアント側の平野数として扱うことができるようにするため?

+1

あなたは '' Validator.IsNotValidPeriod(ID)を意味しますか? –

+0

修正されました。ありがとうございました。 –

+0

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

答えて

4

Json.Netに、JsonConverter属性を使用してそのタイプを処理する方法を伝えることができます。

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

関連する問題