2015-04-02 6 views
7

Ich lese eine große JSON-Datei erfolgreich in JObjects. Einer der Typen, in denen ich deserialize, hat eine Eigenschaft vom Typ System.Drawing.Color. Der JSON für diese Eigenschaft hat einen Ganzzahlwert, der die Farbe darstellt. Wenn ich versuche, einen ToObject zu tun() Ich bekommeWie verwende ich einen JsonConverter mit JToken.ToObject <>() Methode?

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

Die Lösung scheint eine einfache JsonConverter zu sein, die von einer ganzen Zahl in eine Farbe umwandeln können, aber ich kann nicht herausfinden, wie den Konverter mit einem bestehenden verwenden JObject. Fehle ich etwas Offensichtliches?

Antwort

9

Es gibt eine Überlastung von ToObject<T>, die eine JsonSerializer akzeptiert. Der Serializer verfügt über eine Converters Sammlung, in die Sie Ihren Konverter hinzufügen können.

Hier ist eine kurze 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)); 
    } 
} 

Ausgang:

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

Fiddle: https://dotnetfiddle.net/ZA22mD

+0

Dank dafür! Das Bit, das ich vermisste, war das Erstellen des Konverters und das Hinzufügen zu einem Serialisierer. Ich muss sagen, die Json.NET-Dokumentation benötigt einen höheren Überblick darüber, wie die Teile zusammenpassen. –

+0

Kein Problem; froh, dass ich helfen konnte. –

Verwandte Themen