2015-04-02 28 views
7

我正在成功读取一个大的JSON文件到JObjects中。我反序列化成的类型之一是System.Drawing.Color类型的属性。此属性的JSON具有表示颜色的整数值。当我尝试做一个ToObject(±)Ⅰ得到如何使用JToken.ToObject <>()方法使用JsonConverter?

Error converting value 16711680 to type 'System.Drawing.Color'. 

的解决方案似乎是一个简单的JsonConverter可以从一个整数转换成一个颜色,但我不能找出如何使用转换器与现有JObject。我错过了明显的东西吗?

回答

9

ToObject<T>有超负荷接受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] 

小提琴:https://dotnetfiddle.net/ZA22mD

+0

感谢您的!我缺少的是创建转换器,然后将其添加到序列化程序。我不得不说,Json.NET文档需要更高层次的关于这些部分如何组合在一起的概述。 – 2015-04-03 12:56:08

+0

没问题;很高兴我能帮上忙。 – 2015-04-03 13:41:16

相关问题