2 votes

Désérialisation de valeurs hexadécimales avec Newtonsoft JSON

J'essaie de désérialiser json en un objet C#. Le json ressemble essentiellement à ceci :

{ "hexValue": "0x9a7f" }

Mon POCO ressemble à ceci :

public class HexTest
{
     public int hexValue;
}

J'ai lu dans un lien de cette question que Newtonsoft supporte la désérialisation des valeurs hexagonales. Mais pour être juste, ces notes de mise à jour ont été publiées il y a dix ans. J'ai même lu dans du code source sur github publié ici ce qui semble être du code pour désérialiser une chaîne formatée en hexadécimal qui commence par "0x". Pourtant, lorsque j'essaie de désérialiser une valeur hexagonale, j'obtiens toujours l'exception suivante :

Impossible de convertir une chaîne en int : 0x9a7f.

Peu importe le type que j'essaie. J'ai essayé d'utiliser int long decimal Decimal, etc... En lisant la source, il semblait que le type Decimal aurait dû fonctionner, mais rien ne fonctionne. Est-ce que Newtonsoft a vraiment un support pour convertir des valeurs hexadécimales définies comme des chaînes de caractères en un type de données numériques quelconque ?

Bien sûr, je sais que je peux utiliser les informations contenues dans la question dont j'ai donné le lien ci-dessus pour mettre en œuvre un support personnalisé, mais je préférerais vraiment utiliser le support intégré s'il existe.

2voto

Vector Points 43

Grâce aux commentaires de Fildor à ma question originale ci-dessus, j'ai pu résoudre le problème en supprimant les guillemets autour de la valeur dans le JSON de sorte qu'il se lit maintenant comme ceci :

{ "hexValue": 0x9a7f }

De plus, des tests supplémentaires révèlent que tous les types de données numériques fonctionnent dans la POCO, y compris int, long et decimal. Il est probablement utile de noter que (je ne suis pas sûr de la dernière norme) la plupart des validateurs JSON, sinon tous, considéreront que ce JSON n'est pas valide car l'hexadécimal n'est pas un type de données numériques valide pour JSON.

En regardant à nouveau la source, on comprend pourquoi cela fonctionne et pas la chaîne de caractères. L'analyseur syntaxique n'appellera la méthode qui détecte le préfixe 0x que s'il reconnaît le jeton de valeur json comme un type numérique, ce qui, s'il est cité, ne peut pas se faire car, par définition, c'est une chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X