2013-11-20 3 views
11

Я десериализую свойства json в перечисление, но у меня возникают проблемы с обработкой случаев, когда свойство является пустой строкой.Как обрабатывать десериализацию пустой строки в enum в json.net

Ошибка преобразования значения "" для типа 'EnrollmentState'

Я пытаюсь десериализации state собственности в requiredItem.

{ 
    "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 без какого-либо конвертера. Сериализация все еще является проблемой. –

Смежные вопросы