使用 Newtonsoft JSON 反序列化十六进制值

Posted

技术标签:

【中文标题】使用 Newtonsoft JSON 反序列化十六进制值【英文标题】:Deserialize hexadecimal values with Newtonsoft JSON 【发布时间】:2020-08-22 09:14:45 【问题描述】:

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

 "hexValue": "0x9a7f" 

我的 POCO 是这样的:

public class HexTest

     public int hexValue;

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

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

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

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

【问题讨论】:

你试过 "hexValue": 0x9a7f 吗?或者你真的是想成为字符串? 大声笑,神圣的$#@!起初我确实尝试过,但那是我尝试在我的 POCO 中使用 int 类型的时候。它因另一个例外而窒息。但是,现在我尝试了不带引号和小数类型的方法,它可以工作!!!!!!谢谢!!不敢相信在发布问题之前我没有考虑过尝试。我希望有更好的记录。在 newtonsoft 文档站点上搜索十六进制会产生 0 个结果。事实上,我之前一定做了其他事情来搞砸它,因为它现在似乎可以正确解析所有数字数据类型。很奇怪。 也许,既然您知道什么是有效的,您就可以为自己的问题写一个详尽的答案,这样其他有同样问题的人就可以从中获利,并避免自己在文档地狱的无指导之旅?我的建议只是一个意外......所以实际上应该更能够告诉为什么这有效。 我希望你能回答这个问题,但当然,我很乐意。 正如我所说,这只是一剂良药。我无法(真的)解释为什么这有效以及它记录在哪里......所以,没什么值得称赞的。你完成了这项工作。 【参考方案1】:

感谢 Fildor 对我上面原始问题的 cmets,我能够通过删除 JSON 中值周围的引号来解决问题,因此它现在如下所示:

 "hexValue": 0x9a7f 

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

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

【讨论】:

以上是关于使用 Newtonsoft JSON 反序列化十六进制值的主要内容,如果未能解决你的问题,请参考以下文章

使用Newtonsoft.Json.dll序列化和反序列化

反序列化时的 Newtonsoft.JSON 空值

如何使用 Newtonsoft.Json 反序列化 JSON 数组

Newtonsoft.Json.JsonSerializationException:'反序列化对象时出现意外标记:使用动态对象注释

如何使用 Newtonsoft 反序列化 EPOCH

使用 Newtonsoft 反序列化未命名数组的 JSON 数组