2013-11-20 18 views
11

jsonのプロパティをenumに逆シリアル化していますが、プロパティが空の文字列の場合は問題を処理しています。json.netで空の文字列をenumに逆シリアル化する方法

値を変換エラー "" 'EnrollmentState'

を入力するために、私はrequiredItemstateプロパティをデシリアライズしようとしています。

{ 
    "currentStage" : "Pre-Approved", 
    "stages" : ["Applicant", "Pre-Approved", "Approved", "Enrolled"], 
    "requiredItems" : [{ 
      "id" : 1, 
      "name" : "Documents", 
      "state" : "" 
     }, { 
      "id" : 2, 
      "name" : "Eligibility Verification", 
      "state" : "complete" 
     }, { 
      "id" : 3, 
      "name" : "Placement Information", 
      "state" : "incomplete" 
     } 
    ] 
} 

RequiredItemクラスと列挙...

public class RequiredItem { 

    /// <summary> 
    /// Gets or sets the identifier. 
    /// </summary> 
    /// <value>The identifier.</value> 
    public string id { get; set; } 

    /// <summary> 
    /// Gets or sets the name. 
    /// </summary> 
    /// <value>The name.</value> 
    public string name { get; set; } 

    /// <summary> 
    /// Gets or sets the status. 
    /// </summary> 
    /// <value>The status.</value> 
    [JsonProperty(ItemConverterType = typeof(StringEnumConverter))] 
    public EnrollmentState state { get; set; } 
} 

[JsonConverter(typeof(StringEnumConverter))] 
public enum EnrollmentState { 

    [EnumMember(Value = "incomplete")] 
    Incomplete, 

    [EnumMember(Value = "actionNeeded")] 
    ActionNeeded, 

    [EnumMember(Value = "complete")] 
    Complete 
} 

どのように空の文字列は、実行時エラーを投げるのではなく、EnrollmentState.Incompleteにデシリアライズされるように、私は逆シリアル化のためのデフォルト値を設定することができますか?

+0

はあなただけEnrollmentState列挙に空の文字列のためのハンドラを追加することはできますか? – Maess

答えて

17

あなたがいることをしたい場合は、カスタムStringEnumConverterを実装する必要があります。

public class EnrollmentStateEnumConverter : StringEnumConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (string.IsNullOrEmpty(reader.Value.ToString())) 
      return EnrollmentState.Incomplete; 

     return base.ReadJson(reader, objectType, existingValue, serializer); 
    } 
} 

[JsonConverter(typeof(EnrollmentStateEnumConverter))] 
public enum EnrollmentState 
{ 
    [EnumMember(Value = "incomplete")] 
    Incomplete, 

    [EnumMember(Value = "actionNeeded")] 
    ActionNeeded, 

    [EnumMember(Value = "complete")] 
    Complete 
} 
+2

NewtonSoft-6.0.5では、列挙型の逆シリアル化は大文字と小文字を区別しません。 json値としての「不完全」は、変換なしでEnrollmentSate.Incompleteに正常に逆シリアル化されます。 シリアル化は依然として問題です。 –

関連する問題