使用 TypeNameHandling 对 System.Drawing.Color 进行 JSON.NET 序列化

2023-12-04

我想序列化一个Dictionary<string, object>可能包含System.Drawing.Color值或其他类型作为值。我创建了一个序列化器TypeNameHandling.Auto,这适用于大多数课程,但不适用于Color.

示例代码:(DotNetFiddle:https://dotnetfiddle.net/UvphQO)

public class Program
{
    class A { }
    class B { }

    public static void Main()
    {
        Dictionary<string, object> dict = new Dictionary<string, object>();
        dict["Foo"] = new A();
        dict["Bar"] = new B();
        dict["Baz"] = new object();
        dict["Rainbow"] = Color.FromArgb(20, 20, 20, 20);

        var ser = new JsonSerializer
        {
            TypeNameHandling = TypeNameHandling.Auto
        };
        var w = new JsonTextWriter(Console.Out)
        {
            Formatting = Formatting.Indented
        };
        ser.Serialize(w, dict);
    }
}

结果输出:

{
  "Foo": {
    "$type": "Program+A, mi1i2eqo"
  },
  "Bar": {
    "$type": "Program+B, mi1i2eqo"
  },
  "Baz": {},
  "Rainbow": "20, 20, 20, 20"
}

正如预期的那样,实例A or B字典里有需要的$type用于重建的元数据。但实例Color不要。当这个json被反序列化时,dict["Rainbow"] is a System.String.

有很多方法可以解决这个问题,但首选的解决方案是找出序列化器执行看似不正确的操作的原因$type在这种情况下。


问题是System.Drawing.Color有一个关联的TypeConverter,Json.Net 使用它来将类型转换为字符串值并返回。但是,由于输出值是字符串(不是复杂对象),因此 Json.Net 不会为其输出任何类型信息。如果您的属性定义为,这会在反序列化期间导致问题object而不是强类型:Json.Net 将无法找到TypeConverter,因此它将无法将字符串值转换回Color.

解决该问题的一种方法是将Color在另一个具有强类型颜色值属性的类中。

class ColorHolder
{
    public System.Drawing.Color Value { get; set; }
}

然后,Json.Net 将写出包装类的类型信息,这将允许嵌套Color要正确反序列化的结构。这是一个往返演示:

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, object> dict = new Dictionary<string, object>();
        dict["Rainbow"] = new ColorHolder { Value = Color.FromArgb(10, 20, 30, 40) };

        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.Auto,
            Formatting = Formatting.Indented
        };

        string json = JsonConvert.SerializeObject(dict, settings);
        Console.WriteLine(json);
        Console.WriteLine();

        var d = JsonConvert.DeserializeObject<Dictionary<string, object>>(json, settings);

        ColorHolder holder = (ColorHolder)d["Rainbow"];
        Console.WriteLine("A=" + holder.Value.A);
        Console.WriteLine("R=" + holder.Value.R);
        Console.WriteLine("G=" + holder.Value.G);
        Console.WriteLine("B=" + holder.Value.B);
    }
}

Output:

{
  "Rainbow": {
    "$type": "JsonTest.ColorHolder, JsonTest",
    "Value": "10, 20, 30, 40"
  }
}

A=10
R=20
G=30
B=40
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 TypeNameHandling 对 System.Drawing.Color 进行 JSON.NET 序列化 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 嵌入式模式下的 JSP 单元测试

    我正在构建一个小型框架来对 JSP 进行单元测试 这些 JSP 有一些自定义标签 除此之外它们并没有什么特别的 尽管有许多可用的 Java 单元测试解决方案 但我不喜欢使用启动单独的成熟 JSP 容器 部署应用程序并通过 TCP 连接收集结
  • 如何使用 selenium python 向下滚动谷歌工作页面

    我正在尝试使用以下行向下滚动职位发布 但有时会给出正确的结果 向下滚动到末尾 有时则不会 html driver find element by tag name html time sleep 5 html send keys Keys
  • 为什么 strlen 的 REPNE SCASB 实现可以工作?

    为什么这段代码有效 http www int80h org strlen 表示字符串地址必须位于EDI为 注册scasb工作 但这个汇编功能似乎并没有做到这一点 汇编代码为mystrlen global mystrlen mystrlen
  • R:将数据集变量中的计数“反累积”到各个行[重复]

    这个问题在这里已经有答案了 我是 R 初学者 花了几个小时尝试解决问题 我会 反累积 数据集中变量的值 获得行中的各个观察值 我认为最好用一个例子来解释这一点 我会从 Variable 1 Variable 2 Count GROUP1 A
  • 将日期作为因子错误转换为日期

    我在计算从 csv 文件导入的日期时遇到问题 我想要做的是在因素 DateClosed 中获取该日期并在日期字段 a 中生成日期 例如 如果 a 203 我希望日期等于 DateClosed 203 但是 我在使用下面列出的代码时遇到了问题
  • Android FLAG_ACTIVITY_CLEAR_TOP 无法正常工作?

    我真的不明白所有这些标志是如何工作的 因为我完全按照文档所说的操作 并且它没有解决我的问题 我的活动是这样启动的 第一 活动 A gt 活动 B gt 第二 活动 A 如果我按返回按钮 它会返回到活动 B gt 活动 A gt 退出应用程序
  • 通过 PowerShell 命令获取返回对象的类 - 确定 cmdlet 的输出数据类型

    在PowerShell中 如果一个命令返回一个或多个对象的数组 我可以通过以下方法找出该对象的类 ab SampleCommand ab 0 getType 但是 如果命令没有返回任何内容 0 值的数组 我如何找出该命令的默认返回类型 注意
  • 我可以使用java在黑莓手机上打开“.pdf”文档吗?

    我可以使用java在黑莓手机上打开 pdf 文档吗 如果是 那么如何 黑莓中没有任何本地功能可以加载pdf文件 但是您可以在浏览器字段中加载谷歌查看器 这样就可以了 D public ScrLoad String url http docs
  • 如何更改 GitHub 上存储库的语言?

    GitHub 搜索允许按语言过滤存储库 如何将存储库设置为特定语言 您还可以覆盖某些文件 cat gitattributes rb linguist language Java Source
  • 更改最后一个字母的颜色

    示例代码 p class test string p 我想更改最后一个字母的颜色 在本例中为 g 但我需要 css 解决方案 我不需要 javascript 解决方案 我一个字母一个字母地显示字符串 但无法使用静态解决方案 大家都说做不到
  • 使用 PHP 八进制和字符串转换

    我正在使用一个数据库 该数据库包含一堆以前导 0 为前缀的序列号 因此 序列号可能类似于 00032432 或 56332432 问题在于 PHP 我不明白八进制转换系统是如何工作的 一个具体的例子是 我试图将所有这些基于整数的数字与字符串
  • 升级到 mac Big Sur 后,SnowSQL 失败,并显示“无法找到库安全性”

    升级到 macOS Big Sur 后 我的 Snowsql 脚本全部失败 并显示 无法找到库安全性 snowsql q select 1 x User me Password XXX The library Security could
  • 字符编码UTF-8和ISO-8859-1规则是什么

    我想知道是否有一篇文章讨论字符编码 UTF 8 和 ISO 8859 1 的规则 有人也可以指出我其他字符编码的规则吗 读这个 http www joelonsoftware com articles Unicode html 它将清除您对
  • 如何在注入的服务中访问用户令牌以重新编码密码?

    我有下面的代码 我试图在用户登录时重新编码密码 数据库已从旧网站迁移 但是 我不确定我做错了什么 因为我不断收到错误 尝试调用类 AppBundle Service HubAuthenticator 的名为 forward 的未定义方法 我
  • 如何将四元数转换为角度?

    有没有将四元数转换为角度的公式 希望使用 Core Motion API 和陀螺仪在 iPhone 上做一些事情 以便根据我从它收到的数据 以四元数的形式 我可以在屏幕上投影 UIView Thanks Yes see Quaternion
  • Google Cloud Functions 是否能够免受 DDoS 攻击?

    据我了解 我的 Google Cloud Functions 可以在全球范围内访问 如果我想控制对它们的访问 我需要将授权作为函数本身的一部分来实现 比如说 我可以使用基于不记名令牌的方法 这将保护该功能背后的资源免遭未经授权的访问 然而
  • iOS requestAccessToAccountsWithType 不显示权限提示/NSAlert

    据我了解 当我调用 ACAccountStore requestAccessToAccountsWithType options completion 用户应该会看到一个 UIAlert 询问他们是否授予我的应用程序权限 当我运行这段代码时
  • 实施 Google URL 缩短 API 的跨域问题

    我正在尝试在 jQuery 的帮助下通过 AJAX 调用来实现 Google URL 缩短器 API 我做过这样的事情 function btnshorten click function var longURL tboxLongURL v
  • 使用 PHP 获取 Discord 中的成员总数

    我有一个拥有 1361 名成员的 Discord 服务器 我想在我的网站上显示加入用户的总数 我已经弄清楚如何使用以下方法获取服务器上的所有在线会员 我应该采取什么不同的做法来获取已加入服务器的所有用户的总
  • 使用 TypeNameHandling 对 System.Drawing.Color 进行 JSON.NET 序列化

    我想序列化一个Dictionary