2012-03-17 11 views
10

Tengo una clase con el tipo de propiedad de Point (struct en .NET Framework). Uso JsonConvert de Newton.Json para serializarlo en JSON. Pero resultado esProblema de serialización de JSON.NET

"Point" : "100,100" 

En lugar de

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

Si se sustituyen JsonConvert con la norma JavaScriptSerializer, todo trabaja muy bien.

Pero quiero usar JsonConverter de JSON.Net, porque es mucho más rápido.

+0

para que tenga su solución? –

+0

sí, pero quiero usar JsonConverter de Json.Net, porque es mucho más rápido. –

+0

¿Quiere decir 'System.Drawing.Point',' System.Windows.Point', o algún otro tipo? – svick

Respuesta

8

Eso es porque Point ha definido su propio TypeConverter y JSON.NET lo usa para hacer la serialización. No estoy seguro de si hay una manera limpia para convertir este comportamiento fuera, pero que sin duda puede crear su propio JsonConverter que se comporta de la manera deseada:

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((double)jObject["X"], (double)jObject["Y"]); 
    } 

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

A continuación, puede utilizar de esta manera:

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