2012-12-10 12 views
8

Khi sử dụng JSON.Net để sắp xếp/deserialize cấu trúc, kiểu cấu trúc dựng sẵn (như System.Drawing.Size) tuần tự hóa thành chuỗi, trong khi kiểu cấu trúc tùy chỉnh tuần tự hóa thành đối tượng JSON.Sự khác biệt tuần tự hóa cấu trúc JSON.Net

Ví dụ:

using System; 
using System.Drawing; 
using Newtonsoft.Json; 

namespace TestJsonNet 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(JsonConvert.SerializeObject(new Size(50, 50))); 
      Console.WriteLine(JsonConvert.SerializeObject(new Size2(50, 50))); 
     } 
    } 

    struct Size2 
    { 
     public int Width { get; set; } 
     public int Height { get; set; } 
     public Size2(int w, int h) : this() 
     { 
      Width = w; Height = h; 
     } 
    } 
} 

đầu ra như sau:

"50, 50" 
{"Width":50,"Height":50} 

tôi có thể hiểu được những suy nghĩ đằng sau serializing một struct thành một chuỗi, vì cách bố trí bộ nhớ luôn là như nhau; Tuy nhiên, tại sao sự khác biệt khi serializing một cấu trúc tùy chỉnh?

Ngoài ra, tôi sẽ (vì lý do di sản nội bộ), muốn có các cấu trúc tuần tự JSON.Net giống như trường hợp sau (tức là JSON, không phải chuỗi). Nếu có thể, làm thế nào có thể đạt được?

+1

tôi đã tìm thấy bài viết này [JSON.NET serialization rắc rối] (http://stackoverflow.com/questions/9750836/json-net-serialization-trouble) Tuy nhiên, tôi vẫn muốn tắt hành vi này cho tất cả các loại cấu trúc tại một ngã swoop. –

Trả lời

2

Sử dụng phản ánh bạn có thể giải quyết vấn đề này. Tôi đã tham gia giải pháp mà bạn tự đề xuất và sử dụng phản chiếu để có được tên và giá trị thuộc tính.

class StructConverter : JsonConverter 
{ 
    public override void WriteJson(
     JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var myObject = (object)value; 
     var jObject = new JObject(); 

     Type myType = myObject.GetType(); 
     IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties()); 

     foreach (PropertyInfo prop in props) 
     { 

      jObject.Add(prop.Name, prop.GetValue(myObject, null).ToString()); 
     } 
     serializer.Serialize(
      writer, jObject); 
    } 

....

public override bool CanConvert(Type objectType) 
    { 
     return objectType.IsValueType; 
    } 
} 
+0

Câu trả lời thực sự cho câu hỏi của tôi là: bạn không thể. Không có cách nào để cấu hình JSON.NET để nó sử dụng công cụ chuyển đổi riêng của nó thay vì TypeConverter. Nhưng, tôi sẽ cung cấp cho bạn kiểm tra (và huy hiệu necromancer?) Vì nó có lẽ là chung chung nhất. –

+0

Cảm ơn Dave. Tôi tự hỏi, nếu có JSON serializers cho .net ra khỏi đó mà làm điều này ra khỏi hộp. –

+0

Có, có. Có một cái nhìn để ServiceStack.Text. Nếu bạn cung cấp hai hàm Parse và ToString cho một cấu trúc, nó lấy các hàm đó để deserialize và tuần tự hóa. Tôi thấy nó khá hữu ích. – jruizaranguren