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

标签 c# json.net hex json-deserialization

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

{ "hexValue": "0x9a7f" }

我的 POCO 看起来像这样:

public class HexTest
{
     public int hexValue;
}

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

Could not convert string to int: 0x9a7f.

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

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

最佳答案

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

{ "hexValue": 0x9a7f }

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

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

关于c# - 使用 Newtonsoft JSON 反序列化十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61651623/

相关文章:

c# - 无法连接到远程 WCF 服务 - SecurityNegotiationException

c# - 如何强制仅匿名访问 Controller 操作?

c# - JSONConvert.DeserializeObject 不处理具有未命名数组项的子数组

string - 在lua中将字符串转换为十六进制?

java - 来自新设备的不同十六进制响应

c++ - (C++) 将十六进制字符串写入文件

c# - Location.X 等于列表框中的 Top,Left 吗?

c# - 多线程时与 PostgreSQL 的连接失败。 C#

c# - 遵循 EnumMemberAnnotation 的 Enum.ToString()

c# - 如何从 Newton.Json.Linq.JToken 转换为 byte[]?