如何通过JToken.ToObject<>()方法使用JsonConverter? [英] How to use a JsonConverter with JToken.ToObject<>() method?

查看:431
本文介绍了如何通过JToken.ToObject<>()方法使用JsonConverter?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将大型JSON文件成功读取到JObjects中.我反序列化的一种类型具有System.Drawing.Color类型的属性.此属性的JSON具有一个表示颜色的整数值.当我尝试执行ToObject()时,我会得到

I'm reading a large JSON file successfully into JObjects. One of the types I'm deserializing into 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 a ToObject() I get

将值16711680转换为"System.Drawing.Color"时出错.

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

解决方案似乎是一个简单的JsonConverter,它可以从整数转换为Color,但是我不知道如何将转换器与现有的JObject一起使用.我缺少明显的东西吗?

The solution seems to be a simple JsonConverter that can convert from an integer to a Color but I can't find out how to use the converter with an existing JObject. Am I missing something obvious?

推荐答案

ToObject<T>的重载可以接受JsonSerializer.序列化器有一个Converters集合,您可以在其中添加转换器.

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

这是一个简短的演示:

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

这篇关于如何通过JToken.ToObject&lt;&gt;()方法使用JsonConverter?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆