Fine-tuning and simplifying DataContract serialization for very simple classes?

Suppose I have a type whose value can be completely represented by an integer, but has validation logic, and it will be returned and accepted in the Web API. According to good code and avoiding a primitive obsession, I could do something like:

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

Then, when this type is returned by calling the Web API, it is serialized in JSON as:

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

Is there any way to get it serialized to the following?

"FiscalPeriod" : 201601,

So that it can be easily processed as a prime on the client side?

+4
source share
1 answer

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

+4

All Articles