Json.NET StringEnumConverter并不总是工作

Sup*_*bbs 5 c# enums json.net

我有一个枚举:

public enum FilterOperator
    {
        [EnumMember(Value = "eq")]
        Equals,
        [EnumMember(Value = "gt")]
        GreaterThan,
        [EnumMember(Value = "lt")]
        LessThan,
        [EnumMember(Value = "in")]
        In,
        [EnumMember(Value = "like")]
        Like
    }
Run Code Online (Sandbox Code Playgroud)

以及包含枚举属性的类:

public class GridFilter
{
    [JsonProperty("operator")]
    [JsonConverter(typeof(StringEnumConverter))]
    public FilterOperator Operator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

该对象通过WebAPI操作传入,并按预期对“ like”和“ in”进行反序列化,但不适用于“ lg”或“ gt”。知道为什么吗?

更新:好吧,“喜欢”和“从事”工作的原因是它们与枚举名称匹配。将GreaterThan重命名为Gt(etc)是可行的。因此,真正的问题是为什么不使用StringEnumConverter?

Max*_*ini 7

好吧,如果您希望在类的上下文之外反序列化时使用它,则必须将[JsonConverter(typeof(StringEnumConverter))]属性直接放在enum声明上,而不是Operator属性上:GridFilterGridFilter

[JsonConverter(typeof(StringEnumConverter))] // Add this
public enum FilterOperator
{
    [EnumMember(Value = "eq")]
    Equals,
    [EnumMember(Value = "gt")]
    GreaterThan,
    [EnumMember(Value = "lt")]
    LessThan,
    [EnumMember(Value = "in")]
    In,
    [EnumMember(Value = "like")]
    Like
}

public class GridFilter
{
    [JsonProperty("operator")]
    //[JsonConverter(typeof(StringEnumConverter")] // Remove this
    public FilterOperator Operator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)


Sup*_*bbs 4

感谢大家的帮助!我意识到我做了什么。可悲的是,这很愚蠢,我提前为跑来跑去道歉。

由于我使用 GET,我将参数作为 url 查询参数发送,因此 WebAPI 使用普通 ModelBinder 来映射名称,而不是 JSON.NET。我实际上并没有发送 JSON,所以这是完全有道理的。这个问题帮助我认识到这一点: Complex type is getting null in a ApiController argument

我的选择是创建一个正确处理枚举的自定义模型绑定器,或者更改为 POST 并使用 JSON.stringify() 发送数据。