如何使用JSON.Net将System.Drawing.Size反序列化为对象? [英] How to de/serialize System.Drawing.Size to object using JSON.Net?

查看:88
本文介绍了如何使用JSON.Net将System.Drawing.Size反序列化为对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我绝对不知道该怎么做.

I have absolutely no idea how to do this.

我使用的示例类:

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

This getting serialized to {size: "0, 0"}. What I need is {size: {width: 0, height: 0}}.

感谢您的帮助.

推荐答案

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

Here is a simple JsonConverter you can use to make System.Drawing.Size serialize the way you want:

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,如下所示:

To use the converter, you just need to pass an instance of it to JsonConvert.SerializeObject as shown below:

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

Deserialization works the same way; pass an instance of the converter to 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

这篇关于如何使用JSON.Net将System.Drawing.Size反序列化为对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆