2017-09-28 2 views
0

Json.NETが列挙型をシリアル化/逆シリアル化する方法について私は混乱しています。なぜJson.Netは整数として列挙型の値を逆シリアル化し、有効なものとして受け入れますか?

私はJSONスキーマでこのフィールドを持っている:

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

と、このC#コード:私はこの機能を使用する場合

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

public enum MyEnumValue 
{ 
    D, F, R 
} 

JsonConvert.SerializeObject 

を作成したJSONテキストが含まれていますこれは:

"MyEnumValue":82 

JSON.NETはcharをcharのASCII値である整数として期待するenum値を逆シリアル化します。

私の質問は次のとおりです。 *シリアライズでのみチャンクを取得できないのはなぜですか?

  • (ユニバーサル)JSONスキーマのルールは正常ですか?
+2

私はここで何かが欠けする必要があります - あなたの列挙は、一連の整数として定義されます。なぜあなたは脱直列化によって 'char'を得るべきだと思いますか? – xxbbcc

+1

この質問は混乱しています。 'JsonConvert.DeserializeObject'は、JSON文字列をJSONを生成しないオブジェクトに変換するので、' 'MyEnumValue":82'を作成しません。 MyEnumValueの値を明示的に設定していないので、暗黙的に0から2の値が割り当てられます。デフォルトでは82としてシリアル化されることはありません。 –

+1

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

答えて

3

あなたは[デ]に必要がある場合はプロパティにこれを追加し、文字列として列挙型をシリアル化:

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

これが受け入れられる回答である必要があります。それを使用し、それは正常に動作します。 – Lorien

+0

いいえ..動作しません。 Jsonは無効な値も受け入れます。試してみてください。 – Revious

+0

@Revious Json.netは可能な限り最善の変換を試みます。 '{Enum:312}、{Enum:invalid_value}'や '(MyEnumValue)312'のような無効な値を防ぐ必要がある場合は、それらを検証する必要があります:https://www.newtonsoft.com/json/help/html /JsonSchema.htm – Xiaoy312

関連する問題