c# - 使用 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 真的支持将定义为字符串的十六进制值转换为某种数字数据类型吗?
当然,我知道我可以使用上面链接到的问题中的信息来实现对它的自定义支持,但如果有内置支持,我真的更愿意使用它。
解决方案
感谢 Fildor 对我上面的原始问题的评论,我能够通过删除 JSON 中值周围的引号来解决问题,所以它现在看起来像这样:
{ "hexValue": 0x9a7f }
此外,进一步的测试表明,POCO 中的任何数字数据类型都适用于此,包括 int、long 和 decimal。可能值得注意的是(不确定最新标准)大多数(如果不是所有)JSON 验证器都会考虑这个无效的 JSON,因为十六进制不是有效的 JSON 数字数据类型。
再看一下源代码,很明显为什么它有效,而不是字符串。如果解析器将 json 值标记识别为数字类型,则解析器将仅调用检测 0x 前缀的方法,如果引用,则无法执行此操作,因为根据定义,这是一个字符串。
推荐阅读
- python - 如何让 Celery worker 消耗单个任务并退出
- python - 将数字转换为百分比后排序返回不正确的结果
- python - 如何从网站获取一些属性以进行抓取
- sql - 确定列是增加还是减少
- reactjs - 提交表单时,React 应用程序无法按预期工作
- android - 运行模拟器时Android Studio不会显示图像不断抛出错误
- python - TSP [最近邻] - 给定距离矩阵
- amazon-web-services - 模式匹配供应商文件夹的代码部署 appspec.yml 权限规范
- firebase-authentication - CouchDB 用来加密密码的“简单”散列算法是什么?
- flutter - Flutter Swiper:如何在左对齐时在一页上显示多个小部件?