How to use JsonConverter with JToken.ToObject <> () method?

I am reading a large JSON file successfully in JObjects. One of the types that I am deserializing has a property of type System.Drawing.Color. The JSON for this property has an integer value representing the color. When I try to do TOObject (), I get

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

The solution is similar to a simple JsonConverter that can convert from integer to color, but I cannot find out how to use the converter with an existing JObject. Am I missing something?

+7
source share
1 answer

There is an overload of ToObject<T> that accepts a JsonSerializer . The serializer has a Converters collection to which you can add a converter.

Here is a short demo:

 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)); } } 

Output:

 Color [A=0, R=255, G=0, B=0] 

Fiddle: https://dotnetfiddle.net/ZA22mD

+9
source

All Articles