JSON.NET – Troubleshooting JSON.NET Serialization Issues

.netasp.net-mvcjsonserialization

I have a class with property type of Point ( struct in .NET Framework).
I use JsonConvert from Newton.Json to serialize it to JSON.
But result is

 "Point" : "100,100" 

Instead of

 "Point" : { X: "100", Y: "100"}

When I replace JsonConvert with standard JavascriptSerializer,
all works fine.

But I want to use JsonConverter from JSON.Net, because it's much faster.

Best Answer

That's because Point has defined its own TypeConverter and JSON.NET uses it to do the serialization. I'm not sure whether there is a clean way to turn this behavior off, but you can certainly create your own JsonConverter that behaves the way you want:

class PointConverter : JsonConverter
{
    public override void WriteJson(
        JsonWriter writer, object value, JsonSerializer serializer)
    {
        var point = (Point)value;

        serializer.Serialize(
            writer, new JObject { { "X", point.X }, { "Y", point.Y } });
    }

    public override object ReadJson(
        JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        var jObject = serializer.Deserialize<JObject>(reader);

        return new Point((int)jObject["X"], (int)jObject["Y"]);
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Point);
    }
}

You can then use it like this:

JsonConvert.SerializeObject(
    new { Point = new Point(15, 12) },
    new PointConverter())
Related Question