JSON Désérialisation - Chaîne Est Automatiquement Converti en Int
Quand je deseiralize le JSON à C# à l'objet ci-dessous, soit en utilisant Newtonsoft explicitement ou par l'intermédiaire du modèle mécanisme de liaison de ASP.NET l'Api Web, la chaîne id
valeur est automatiquement converti en int. Je m'attends à ce qu'il lève une exception ou d'élever une erreur car il existe une incompatibilité de type. Est-ce que JSON est censé travailler, dans les specs? Si non, comment puis-je prévenir une telle conversion automatique?
JSON: {"id":"4", "name":"a"}
C# modèle: int id; string name
- C'est la fonctionnalité offerte par la sérialisation JSON cadres tels que NewtonSoft et les autres. En JSON objet de cette chaîne. C'est le cadre qui prend soin de conversion de type. Il va sûrement lever une erreur si la chaîne json a "id":"somestring". Cadre va essayer de faire de ce type de conversion, tant que la chaîne JSON valeur est dans un format du type de cible.
- "En objet JSON cette chaîne"... hein? Pas de. {"a":4} et {"a":"4"} sont différents. "a" est un JSON dans un et une chaîne à l'autre. Dans un objet JSON, tout n'est pas une chaîne. Les propriétés peuvent être des chaînes de caractères, des nombres, des autres des autres, ou des tableaux. Interpretting une chaîne de caractères comme un nombre (si elle peut être analysée comme un certain nombre, et le désérialisé type est un nombre qui n'est pas vraiment un problème, de l'OMI. JSON types de sont très de base, donc si vous avez un tableau JSON, c'est bien pour désérialiser comme une Liste, par exemple, si c'est le type de cible. En va de même pour le réglage automatique de la chaîne d'int de conversion (et vice versa).
Vous devez vous connecter pour publier un commentaire.
C'est une caractéristique des Json.NET: lors de la désérialisation d'un type primitif, il vous permet de convertir les primitives de la valeur JSON à la cible de type c# à chaque fois que possible. Depuis la chaîne
"4"
peut être converti en un nombre entier, la désérialisation réussit. Si vous ne voulez pas de cette fonctionnalité, vous pouvez créer un customJsonConverter
pour les types intégraux qui vérifie que le jeton en cours de lecture est vraiment numériques (ounull
, pour un nullable valeur):Note le convertisseur accepte des valeurs comme
4.00
comme des nombres entiers. Vous pouvez modifier cela en enlevant la coche pourJsonToken.Float
si elle ne répond pas à vos besoins.Vous pouvez l'appliquer à votre modèle directement comme suit:
Ou inclure le convertisseur dans
JsonSerializerSettings
de l'appliquer à tous les intégrales des champs:Enfin, pour appliquer sérialiseur JSON paramètres à l'échelle mondiale dans l'API Web, voir, par exemple,ici.
Ce que vous décrivez est une fonction, puisque la plupart des gens veulent que ce genre de comportement. Je n'ai pas vérifier, mais je parie qu'il utilise quelque chose comme
Convert.ChangeType(strValue, propertyType);
qui tente de convertir automatiquement à partir de la chaîne de target type de propriété.Si vous en avez besoin juste comme une chaîne de caractères, utilisez Maksim la solution.
Votre modèle peut également intégrer un supplément de bien d'avoir les deux types, si nécessaire:
id
s qui n'ont pas le type attendu? Si oui, vous pouvez désérialiser dynamique (vérifier Maksim la solution) et de vérifier le type:JsonConvert.DeserializeObject(jsonStr).id.Type
Essayez simplement de faire votre modèle C#, une chaîne si c'est ce que l'on veut.