2012-03-17 9 views
10

Ho una classe con tipo di proprietà Point (struct in .NET Framework). Uso JsonConvert da Newton.Json per serializzarlo su JSON. Ma risultato èProblemi di serializzazione JSON.NET

"Point" : "100,100" 

Invece di

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

Quando sostituisco JsonConvert con lo standard JavaScriptSerializer, tutto funziona benissimo.

Ma voglio usare JsonConverter da JSON.Net, perché è molto più veloce.

+0

quindi hai la soluzione? –

+0

sì, ma voglio usare JsonConverter di Json.Net, perché è molto più veloce. –

+0

Vuoi dire 'System.Drawing.Point',' System.Windows.Point', o qualche altro tipo? – svick

risposta

8

Questo perché Point ha definito il proprio TypeConverter e JSON.NET lo utilizza per eseguire la serializzazione. Io non sono sicuro se c'è un modo pulito per disattivare questo comportamento, ma si può certamente creare il proprio JsonConverter che si comporta nel modo desiderato:

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

è possibile utilizzare in questo modo:

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