Десериализуйте шестнадцатеричные значения с помощью Newtonsoft JSON - PullRequest
2 голосов
/ 07 мая 2020

Я пытаюсь десериализовать json в объект C#. json в основном выглядит так:

{ "hexValue": "0x9a7f" }

Мой POCO выглядит так:

public class HexTest
{
     public int hexValue;
}

Я прочитал ссылку из этот вопрос , который Newtonsoft поддерживает десериализацию шестнадцатеричных значений. Но, честно говоря, эти примечания к выпуску были опубликованы десять лет назад go. Я даже читал в некотором исходном коде на github, опубликованном здесь , что похоже на код десериализации строки в шестнадцатеричном формате, которая начинается с «0x». Тем не менее, когда я пытаюсь десериализовать шестнадцатеричное значение, я всегда получаю следующее исключение:

Не удалось преобразовать строку в int: 0x9a7f.

Это не имеет значения какого типа пробую. Я пробовал использовать int long decimal Decimal, et c ... При чтении источника казалось, что тип Decimal должен работать, но ничего не работает. Действительно ли Newtonsoft поддерживает преобразование шестнадцатеричных значений, определенных как строки, в какой-либо тип данных numeri c?

Конечно, я знаю, что могу использовать информацию в вопросе, на который я ссылался выше, для реализации настраиваемой поддержки для этого, но я бы предпочел использовать встроенную поддержку, если она есть.

1 Ответ

2 голосов
/ 07 мая 2020

Благодаря комментариям Филдора к моему исходному вопросу выше, я смог решить проблему, удалив кавычки вокруг значения в JSON, так что теперь оно выглядит так:

{ "hexValue": 0x9a7f }

Также дальнейшее тестирование показывает, что в POCO для этого работает любой из типов данных numeri c, включая int, long и decimal. Вероятно, стоит отметить, что (не уверены в последнем стандарте) большинство, если не все JSON валидаторы будут считать это недопустимым JSON, потому что шестнадцатеричный формат не является допустимым типом данных JSON numeri c.

Еще раз взглянув на источник, становится ясно, почему это работает, а не строка. Синтаксический анализатор вызовет метод, который обнаруживает префикс 0x, только в том случае, если он распознает токен значения json как тип numeri c, который, если он заключен в кавычки, не может этого сделать, потому что по определению это строка.

...