2017-09-28 4 views
0

Je ne comprends pas comment Json.NET sérialise/désérialise les énumérations.Pourquoi Json.Net désérialise la valeur enum en entier et l'accepte comme valide?

J'ai ce domaine dans mon JSON schéma:

"MyEnumValue": { 
    "type": "string", 
    "enum": ["D", "F", "R"] 
}, 

et ce code C#:

[JsonProperty(PropertyName = "MyEnumValue", Required = Required.Always)] 
public MyEnumValue MyEnumValue { get; set; } 

public enum MyEnumValue 
{ 
    D, F, R 
} 

Lorsque j'utilise cette fonction:

JsonConvert.SerializeObject 

Le créé texte JSON contient ceci:

"MyEnumValue":82 

JSON.NET désérialise donc une valeur enum qui attend char comme un entier qui est une valeur ASCII d'un char.

Mes questions sont: * Pourquoi est-ce que je n'obtiens le caractère que par Sérialisation?

  • Est-ce normal pour les règles de schéma JSON (universelles)?
+2

Je dois manquer quelque chose - votre ENUM est définie comme une série d'entiers. Pourquoi pensez-vous que vous devriez obtenir un «char» en désérialisant? – xxbbcc

+1

Cette question est déroutante. 'JsonConvert.DeserializeObject' convertirait une chaîne JSON en un objet qui ne produirait pas JSON afin de ne pas créer' "MyEnumValue": 82'. Vous n'avez pas explicitement défini la valeur de votre 'MyEnumValue' de sorte qu'ils se verront attribuer implicitement les valeurs 0 à 2 - ils ne seront jamais sérialisés en tant que 82 par défaut. –

+1

'(MyEnumValue) 'R' == 82' –

Répondre

3

Si vous devez [de] sérialiser l'ENUM en tant que chaîne, ajoutez à la propriété:

[JsonProperty(PropertyName = "Enum", Required = Required.Always)] 
[JsonConverter(typeof(StringEnumConverter))] 
public MyEnumValue MyEnumValue { get; set; } 
+0

Ceci devrait être la réponse acceptée. Utilisé ça et ça marche bien. – Lorien

+0

Non .. cela ne fonctionne pas. Json accepte également les valeurs non valides. Essayez-le. – Revious

+0

@Revious Json.net va juste essayer de convertir le mieux possible. Si vous devez empêcher une valeur invalide comme '{Enum: 312}, {Enum: invalid_value}' ou '(MyEnumValue) 312', vous devez les valider: https://www.newtonsoft.com/json/help/html /JsonSchema.htm – Xiaoy312