2012-03-17 106 views
10

我有一個屬性類型爲Point(.NET Framework中的結構)的類。 我使用來自Newton.Json的JsonConvert將其序列化爲JSON。 但結果是JSON.NET序列化問題

"Point" : "100,100" 

而不是

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

當我與標準JavascriptSerializer取代JsonConvert, 一切工作正常。

但我想從JSON.Net使用JsonConverter,因爲它更快。

+0

所以你有你的解決方案? – 2012-03-17 14:54:00

+0

是的,但我想從Json.Net使用JsonConverter,因爲它更快。 – 2012-03-17 14:57:42

+0

你的意思是'System.Drawing.Point','System.Windows.Point'還是其他類型? – svick 2012-03-17 15:29:47

回答

8

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

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

然後,您可以使用它像這樣:

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