【问题标题】:How to use a JsonConverter with JToken.ToObject<>() method?如何使用带有 JToken.ToObject<>() 方法的 JsonConverter?
【发布时间】:2015-06-07 22:28:38
【问题描述】:

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

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

解决方案似乎是一个简单的 JsonConverter,可以将整数转换为颜色,但我不知道如何将转换器与现有的 JObject 一起使用。我错过了什么明显的东西吗?

【问题讨论】:

    标签: c# json.net type-conversion converters


    【解决方案1】:

    ToObject&lt;T&gt; 的重载接受 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

    【讨论】:

    • 谢谢!我缺少的一点是创建转换器,然后将其添加到序列化程序中。我不得不说,Json.NET 文档需要对这些部分如何组合在一起进行更高级别的概述。
    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多