如何使用JSON.Net将System.Drawing.Size序列化/序列化为对象?

我完全不知道怎么做。

我使用的示例类:

class MyClass { private Size _size = new Size(0, 0); [DataMember] public Size Size { get { return _size; } set { _size = value; } } } 

这被序列化为{size: "0, 0"} 。 我需要的是{size: {width: 0, height: 0}}

任何帮助表示赞赏,谢谢。

这是一个简单的JsonConverter您可以使用它来使System.Drawing.Size以您希望的方式序列化:

 using System; using System.Drawing; using Newtonsoft.Json; using Newtonsoft.Json.Linq; public class SizeJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(Size)); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { Size size = (Size)value; JObject jo = new JObject(); jo.Add("width", size.Width); jo.Add("height", size.Height); jo.WriteTo(writer); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); return new Size((int)jo["width"], (int)jo["height"]); } } 

要使用转换器,只需将其实例传递给JsonConvert.SerializeObject ,如下所示:

 MyClass widget = new MyClass { Size = new Size(80, 24) }; string json = JsonConvert.SerializeObject(widget, new SizeJsonConverter()); Console.WriteLine(json); 

这将给出以下输出:

 {"Size":{"width":80,"height":24}} 

反序列化的工作方式相同; 将转换DeserializeObject的实例传递给DeserializeObject

 string json = @"{""Size"":{""width"":80,""height"":24}}"; MyClass c = JsonConvert.DeserializeObject(json, new SizeJsonConverter()); Console.WriteLine(c.Size.Width + "x" + c.Size.Height); 

输出:

 80x24 

您可以使用JsonProperty,而不是每次都将每个单独的属性强制为json结果。

 public class MyClass { [JsonProperty("size")] public Size size; } 

这是你的Size类

 public class Size { public Size(int w, int h) { this.Width = w; this.Height = h; } [JsonProperty("width")] public int Width { get; set; } [JsonProperty("height")] public int Height { get; set; } } 

这就是你访问它的方式

  MyClass w = new MyClass{ size = new Size(5, 7) }; string result = JsonConvert.SerializeObject(w); 

这就是你得到的

 {"Size":{"width":5,"height":7}} 

这样,每次在Size类甚至MyClass类中添加新属性时,只需要将JsonProperty属性放在其上。