【问题标题】:How to handle deserialization of empty string into enum in json.net如何处理将空字符串反序列化为 json.net 中的枚举
【发布时间】:2013-12-04 22:55:40
【问题描述】:

我正在将 json 属性反序列化为一个枚举,但是当属性为空字符串时,我遇到了处理问题。

将值“”转换为类型“EnrollmentState”时出错

我正在尝试反序列化 requiredItem 中的 state 属性。

{
    "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,而不是引发运行时错误?

【问题讨论】:

  • 你能在 EnrollmentState 枚举中添加一个空字符串处理程序吗?

标签: c# json.net deserialization


【解决方案1】:

如果需要,您需要实现自定义 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
}

【讨论】:

  • 使用 NewtonSoft-6.0.5,枚举反序列化不区分大小写。 “不完整”作为 json 值将成功反序列化为 EnrollmentSate.Incomplete,无需任何转换器。序列化仍然是个问题。
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2013-09-09
  • 2012-05-10
  • 2014-09-22
  • 1970-01-01
相关资源
最近更新 更多