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

时间:2014-01-31 02:21:55

标签: c# json serialization json.net

我完全不知道该怎么做。

我使用的示例类:

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

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:4)

这是一个简单的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<T>

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

输出:

80x24

答案 1 :(得分:1)

作为Brian Rogers答案的一个快速补充,在(有点常见吗?)情况下,Size是较大类中的内部变量,因此您要序列化/反序列化。这可能是微不足道的,但是由于我是Newtonsoft的JSON解析器的新手,因此花了一些时间来寻找正确的标签。

长话短说,如果您的班级使用Size作为其一部分,并且您想使用上述转换器。假设您有一个名为Agent的类,其中包含Size作为其定义的一部分,则应执行以下操作:

public class Agent
{
        [JsonConverter(typeof(SizeJsonConverter))]
        public Size size = new Size();
        public long time_observed = 0;
}

请注意,标记名称仍为JsonConverter,但其类型是您根据接受的答案的片段创建的转换器子类。

希望像我这样的新手可以节省几分钟的Google搜索时间。

答案 2 :(得分:-1)

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

public class MyClass
{
    [JsonProperty("size")]
    public 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属性放在其上。