2013-11-20 6 views
11

में एनम में खाली स्ट्रिंग के deserialization को संभालने के लिए कैसे मैं एक enum में जेसन गुणों deserializing हूँ, लेकिन संपत्ति एक खाली स्ट्रिंग है जब मुझे मामलों को संभालने में समस्याएं हैं।json.net

मूल्य परिवर्तित "" टाइप करने के लिए त्रुटि 'EnrollmentState'

मैं एक requiredItem में state संपत्ति deserialize करने के लिए कोशिश कर रहा हूँ।

{ 
    "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 वर्ग और enum ...

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 में deserialized किया जाएगा?

+0

तुम सिर्फ एक हैंडलर रिक्त स्ट्रिंग के लिए EnrollmentState enum करने के लिए जोड़ सकते हैं? – 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

न्यूटन सॉफ्ट-6.0.5 के साथ, enum deserialization केस असंवेदनशील है। जेसन मूल्य के रूप में "अधूरा" नामांकन के लिए सफलतापूर्वक deserialize होगा। किसी भी कनवर्टर के बिना अधूरा। सीरियलाइजेशन अभी भी एक समस्या है। –