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

问题描述 投票:1回答:1

我正在尝试将json反序列化为C#对象。 json基本上看起来像这样:

{ "hexValue": "0x9a7f" }

我的POCO看起来像这样:

public class HexTest
{
     public int hexValue;
}

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

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

我尝试哪种类型都没有关系。我尝试使用int长十进制Decimal等。从读取源代码开始,看起来Decimal类型应该可以正常工作,但没有任何效果。 Newtonsoft是否真的支持将定义为字符串的十六进制值转换为某种数字数据类型?

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

c# json.net hex json-deserialization
1个回答
1
投票

多亏了Fildor对我的原始问题的注释,我能够通过删除JSON中的值周围的引号来解决问题,因此现在看起来像这样:

{ "hexValue": 0x9a7f }

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

再看一下源代码,很明显为什么这样做有效,而不是字符串。如果解析器将json值令牌识别为数字类型,则解析器仅会调用检测到0x前缀的方法,如果将其加引号,由于定义,它是字符串,则无法执行。

© www.soinside.com 2019 - 2024. All rights reserved.