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

3

我想把json反序列化为C#对象。这个json基本上看起来像这样:

{ "hexValue": "0x9a7f" }

我的POCO长这样:

public class HexTest
{
     public int hexValue;
}

我在这篇问答中读到Newtonsoft支持反序列化十六进制的值。但说实话,那些发行说明是十年前发布的了。我甚至在这里阅读了一些源代码,其中似乎有解析以 "0x" 开头的十六进制格式字符串的代码。但是,无论我尝试使用何种类型,始终会出现以下异常:

Could not convert string to int: 0x9a7f.

无论我尝试使用int long decimal Decimal等类型,都无济于事。从源代码中看来,Decimal类型应该管用,但什么都不起作用。Newtonsoft是否真的支持将以字符串形式定义的十六进制值转换为某种数值数据类型?

当然,我知道可以使用上面链接中的信息来自定义支持它,但如果内置支持存在,我真的更愿意使用内置支持。


2
你尝试过 { "hexValue": 0x9a7f } 吗?或者你真的是想要它成为字符串吗? - Fildor
2
哈哈,天哪!我一开始就试过了,但是当时我在尝试在我的 POCO 中使用 int 类型,结果出现了不同的异常。然而,现在我尝试了没有引号并且使用了 decimal 类型,它可以工作!!!谢谢!!!简直无法相信我在发布问题之前没有想到尝试这个。我希望有更好的文档记录。在 newtonsoft 文档网站上搜索十六进制会产生 0 个结果。事实上,在此之前我似乎还做了其他事情弄坏了它,因为现在它似乎可以正确解析所有数字数据类型。奇怪。 - Vector
也许现在你已经知道了什么是有效的,你可以写一个详细的答案来回答自己的问题,这样其他遇到同样问题的人就可以受益并避免在文档中浪费时间了吧?我的建议只是一次尝试...所以,_你_应该更能够解释为什么这个方法有效。 - Fildor
1
我本来想给你回答的功劳,但好吧,我很乐意。 - Vector
就像我说的那样,这只是一次试探。我无法真正解释为什么它有效以及它在哪里有记录...所以,没有太多值得称赞的地方。是你做了这项工作。 - Fildor
我本来想让它成为一个字符串。最初它不是,但当我遇到第一个异常时,我认为可能是无效的JSON格式...实际上确实如此。所以我认为这可能是导致异常的原因,并将其转换为字符串。结果只是产生了另一个异常,这就是我开始研究并最终得出这个问题的原因。 - Vector
1个回答

3

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

{ "hexValue": 0x9a7f }

此外,进一步的测试显示,在POCO中,任何数值数据类型都可以用于此,包括int、long和decimal。值得注意的是,(不确定最新标准)大多数(如果不是全部)JSON验证器将认为这是无效的JSON,因为十六进制不是有效的JSON数值数据类型。
再次查看源码,很明显为什么这个数值类型适用而字符串不适用。如果被引号引用,解析器就无法识别json值标记作为数值类型,并调用检测0x前缀的方法,因为按定义来说,它是一个字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接