2015-04-02 11 views
7

Sto leggendo un grande file JSON con successo in JObjects. Uno dei tipi in cui sto deserializzando ha una proprietà di tipo System.Drawing.Color. Il JSON per questa proprietà ha un valore intero che rappresenta il colore. Quando provo a fare un ToObject() ottengoCome utilizzare un JsonConverter con il metodo JToken.ToObject <>()?

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

La soluzione sembra essere un semplice JsonConverter che può convertire da un intero ad un colore, ma non riesco a trovare il modo di utilizzare il convertitore con una già esistente jobject. Mi manca qualcosa di ovvio?

risposta

9

C'è un sovraccarico di ToObject<T> che accetta uno JsonSerializer. Il serializzatore ha una collezione Converters in cui puoi aggiungere il tuo convertitore.

Ecco una breve 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)); 
    } 
} 

uscita:

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

Fiddle: https://dotnetfiddle.net/ZA22mD

+0

Grazie per questo! Il bit che mi mancava era la creazione del convertitore e quindi l'aggiunta a un serializzatore. Devo dire che la documentazione di Json.NET ha bisogno di una panoramica di livello superiore su come le parti si adattano insieme. –

+0

Nessun problema; felice di poterti aiutare –