2012-03-17 35 views
10

Tôi có một lớp với loại thuộc tính của Point (struct trong .NET Framework). Tôi sử dụng JsonConvert từ Newton.Json để tuần tự hóa nó thành JSON. Nhưng kết quả làSự cố serialization JSON.NET

"Point" : "100,100" 

Thay vì

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

Khi tôi thay JsonConvert với tiêu chuẩn JavascriptSerializer, tất cả hoạt động tốt.

Nhưng tôi muốn sử dụng JsonConverter từ JSON.Net, vì nó nhanh hơn nhiều.

+0

để bạn có giải pháp của mình? –

+0

có, nhưng tôi muốn sử dụng JsonConverter từ Json.Net, vì nó nhanh hơn nhiều. –

+0

Bạn có nghĩa là 'System.Drawing.Point',' System.Windows.Point' hoặc một số loại khác không? – svick

Trả lời

8

Đó là vì Point đã xác định TypeConverter và JSON.NET của riêng nó sử dụng nó để thực hiện tuần tự hóa. Tôi không chắc liệu có một cách sạch sẽ để biến hành vi này ra, nhưng bạn chắc chắn có thể tạo riêng của bạn JsonConverter mà ứng xử theo cách bạn muốn:

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

Sau đó, bạn có thể sử dụng nó như thế này:

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