如何使用JToken.ToObject <>()方法的JsonConverter?

问题描述 投票:10回答:1

我正在成功地将一个大型JSON文件读入JObjects。我要反序列化的类型之一具有System.Drawing.Color类型的属性。此属性的JSON具有表示颜色的整数值。当我尝试做ToObject()时,我得到了

将值16711680转换为类型'System.Drawing.Color'时出错。

解决方案似乎是一个简单的JsonConverter,它可以从一个整数转换为一个Color但我无法找到如何将转换器与现有的JObject一起使用。我错过了一些明显的东西吗

c# json.net type-conversion converters
1个回答
15
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.