我正在将一个大型 JSON 文件成功读入 JObjects。我要反序列化的类型之一具有 System.Drawing.Color 类型的属性。此属性的 JSON 具有一个表示颜色的整数值。当我尝试做一个 ToObject() 我得到
将值 16711680 转换为类型“System.Drawing.Color”时出错。
解决方案似乎是一个简单的 JsonConverter,它可以从整数转换为颜色,但我不知道如何将转换器与现有的 JObject 一起使用。我错过了一些明显的东西吗?
我正在将一个大型 JSON 文件成功读入 JObjects。我要反序列化的类型之一具有 System.Drawing.Color 类型的属性。此属性的 JSON 具有一个表示颜色的整数值。当我尝试做一个 ToObject() 我得到
将值 16711680 转换为类型“System.Drawing.Color”时出错。
解决方案似乎是一个简单的 JsonConverter,它可以从整数转换为颜色,但我不知道如何将转换器与现有的 JObject 一起使用。我错过了一些明显的东西吗?
有一个ToObject<T>
接受 a的重载JsonSerializer
。序列化程序有一个Converters
集合,您可以在其中添加转换器。
这是一个简短的演示:
using System;
using System.Drawing;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class Program
{
public static void Main()
{
JObject obj = JObject.Parse(@"{ ""Color"" : 16711680 }");
JsonSerializer serializer = new JsonSerializer();
serializer.Converters.Add(new ColorConverter());
Color c = obj["Color"].ToObject<Color>(serializer);
Console.WriteLine(c.ToString());
}
}
class ColorConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(Color));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(((Color)value).ToArgb());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return Color.FromArgb(Convert.ToInt32(reader.Value));
}
}
输出:
Color [A=0, R=255, G=0, B=0]