JavaScriptSerializer没有反序列化System.Drawing.Color。如何反序列化Color对象?

时间:2014-07-01 05:11:28

标签: c# json serialization deserialization json-deserialization

我使用JavaScriptSerializer在JSON中序列化了System.Drawing.Color,但是当我尝试对其进行反序列化时,它返回Color对象的所有值为0。

示例JSON如下所示。

{
    "A":255,
    "B":0,
    "G":165,
    "IsEmpty":false,
    "IsKnownColor":true,
    "IsNamedColor":true,
    "IsSystemColor":false,
    "Name":"Orange",
    "R":255
}

以下是反序列化对象的截图。

enter image description here

然后我尝试使用JSON.net(newtonsoft.json)库。它给我以下错误。

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Drawing.Color' because the type requires a JSON string value to deserialize correctly.

有没有办法将JSON反序列化为颜色对象。我发现this类似的问题没有任何回答。

3 个答案:

答案 0 :(得分:1)

Json.NET序列化System.Drawing.Color就好了。

Color c = Color.FromArgb(169, 170, 171, 172);
Console.WriteLine(c); //Color [A=169, R=170, G=171, B=172]
string colorStr = JsonConvert.SerializeObject(c);
Console.WriteLine(colorStr); //"169, 170, 171, 172"
Color c1 = JsonConvert.DeserializeObject<Color>(colorStr);
Console.WriteLine(c1); //Color [A=169, R=170, G=171, B=172]

针对Json.NET 6.0.3

进行了测试

答案 1 :(得分:1)

因为我有非常复杂的JSON。我使用Color.FromArgbCustomCreationConverter实现了反序列化。以下是我使用Json.net库的方法。

我创建了一个类,负责处理来自JSON字符串的System.Drawing.Color类的反序列化。你可以在JSON.net网站找到simple example

public class ColorConverter : CustomCreationConverter<Color>
{
    public override bool CanWrite { get { return false; } }
    public override bool CanRead { get { return true; } }
    public ColorConverter(){ }
    public override Color Create(Type objectType)
    {
        return new Color();
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jObject = JObject.Load(reader);
        Color target = Create(objectType);
        target = Color.FromArgb(jObject["A"].Value<Int32>(), jObject["R"].Value<Int32>(), jObject["G"].Value<Int32>(), jObject["B"].Value<Int32>());
        return target;
    }
}

反序列化已创建的类的传递实例以处理自定义反序列化逻辑

MyModelName obj = JsonConvert.DeserializeObject<MyModelName>(json, new ColorConverter());

答案 2 :(得分:0)

也许你可以使用System.Drawing.ColorTranslator.ToHtml将颜色实例转换为代表html颜色的十六进制字符串,并按照Best solution for XmlSerializer and System.Drawing.Color

的建议使用ColorTranslator.FromHtml对其进行反序列化