【问题标题】:JavaScriptSerializer is not deserializing System.Drawing.Color. How to deserialize Color object?JavaScriptSerializer 没有反序列化 System.Drawing.Color。如何反序列化颜色对象?
【发布时间】:2014-08-21 13:48:48
【问题描述】:

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

示例 JSON 如下。

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

这是反序列化对象的屏幕截图。

然后我尝试使用 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 类似的问题没有任何答案。

【问题讨论】:

    标签: c# json serialization deserialization json-deserialization


    【解决方案1】:

    也许您可以使用 System.Drawing.ColorTranslator.ToHtml 将颜色实例转换为代表 html 中颜色的十六进制字符串,并按照 Best solution for XmlSerializer and System.Drawing.Color 的建议使用 ColorTranslator.FromHtml 反序列化它

    【讨论】:

    • 我在可能无法编写System.Drawing.ColorTranslator.ToHtmlColorTranslator.FromHtml 的地方使用了Color 对象。
    【解决方案2】:

    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进行测试

    【讨论】:

    • 我试过了,对我来说它返回颜色的名称,如Orange,而不是 ARGB 的值
    【解决方案3】:

    因为我有非常复杂的 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多