Проблемы с сериализацией JSON.NET

У меня есть класс с типом свойства Point (struct в .NET Framework). Я использую JsonConvert из Newton.Json для сериализации его в JSON. Но результат

 "Point" : "100,100" 

Вместо

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

Когда я заменяю JsonConvert стандартным JavascriptSerializer, все работает нормально.

Но я хочу использовать JsonConverter от JSON.Net, потому что он намного быстрее.

Ответ 1

Это потому, что Point определил свой собственный TypeConverter и JSON.NET использует его для выполнения сериализации. Я не уверен, есть ли чистый способ отключить это поведение, но вы, безусловно, можете создать свой собственный JsonConverter, который будет вести себя так, как вы хотите:

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

Затем вы можете использовать его следующим образом:

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