15

大きな JSON ファイルを JObjects に正常に読み込んでいます。私が逆シリアル化している型の 1 つには、System.Drawing.Color 型のプロパティがあります。このプロパティの JSON には、色を表す整数値があります。ToObject() を実行しようとすると、

値 16711680 を 'System.Drawing.Color' 型に変換中にエラーが発生しました。

解決策は、整数から Color に変換できる単純な JsonConverter のようですが、既存の JObject でコンバーターを使用する方法がわかりません。明らかな何かが欠けていますか?

4

1 に答える 1

19

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

于 2015-04-02T22:28:51.633 に答える