我使用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
}
以下是反序列化对象的截图。
然后我尝试使用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类似的问题没有任何回答。
答案 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.FromArgb
和CustomCreationConverter
实现了反序列化。以下是我使用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
对其进行反序列化