首页 > 解决方案 > 使用 Newtonsoft JSON 反序列化十六进制值

问题描述

我正在尝试将 json 反序列化为 C# 对象。json 基本上是这样的:

{ "hexValue": "0x9a7f" }

我的 POCO 看起来像这样:

public class HexTest
{
     public int hexValue;
}

我从这个问题的链接中读到Newtonsoft 支持反序列化十六进制值。但平心而论,这些发行说明是十年前发布的。我什至在此处发布的 github上阅读了一些源代码,似乎是反序列化以“0x”开头的十六进制格式字符串的代码。然而,当我尝试反序列化一个十六进制值时,我总是得到以下异常:

无法将字符串转换为 int:0x9a7f。

我尝试什么类型并不重要。我试过使用 int long decimal Decimal 等......从阅读源代码来看,Decimal 类型应该可以工作,但没有任何效果。Newtonsoft 真的支持将定义为字符串的十六进制值转换为某种数字数据类型吗?

当然,我知道我可以使用上面链接到的问题中的信息来实现对它的自定义支持,但如果有内置支持,我真的更愿意使用它。

标签: c#json.nethexjson-deserialization

解决方案


感谢 Fildor 对我上面的原始问题的评论,我能够通过删除 JSON 中值周围的引号来解决问题,所以它现在看起来像这样:

{ "hexValue": 0x9a7f }

此外,进一步的测试表明,POCO 中的任何数字数据类型都适用于此,包括 int、long 和 decimal。可能值得注意的是(不确定最新标准)大多数(如果不是所有)JSON 验证器都会考虑这个无效的 JSON,因为十六进制不是有效的 JSON 数字数据类型。

再看一下源代码,很明显为什么它有效,而不是字符串。如果解析器将 json 值标记识别为数字类型,则解析器将仅调用检测 0x 前缀的方法,如果引用,则无法执行此操作,因为根据定义,这是一个字符串。


推荐阅读