使用 Json.Net 在 C# 中反序列化 json (NewtonSoft)

Deserialize a json in C# with Json.Net (NewtonSoft)

我正在使用 Newtonsoft.Json (v6.0.0.0),我正在尝试将 JSON 反序列化为枚举。

我尝试使用属性 EnumMember,它适用于序列化(从 .Net Web API 发送 JSON)但似乎不适用于反序列化.

首先,我有一个这样的模型:

[JsonObject]
public class MyModel
{
    /// <summary>
    /// Gets or sets the username
    /// </summary>
    [Display(Name = @"UserName")]
    [JsonProperty(PropertyName = "userName", Required = Required.Always)]
    public string UserName { get; set; }

          /* .
             . REST OF THE MODEL
             .
             . */

    /// <summary>
    /// Gets or sets the enum model.
    /// </summary>
    [Display(Name = @"EnumModel")]
    [JsonProperty(PropertyName = "enummodel", Required = Required.Always)]
    public MyEnumModel EnumModel { get; set; }
}

MyEnumModel 是具有这些值的枚举:

[JsonConverter(typeof(StringEnumConverter))]
public enum MyEnumModel
{
    [EnumMember(Value = "My Value 1")]
    MyValueOne,

    [EnumMember(Value = "My Value 2")]
    MyValueTwo,

    [EnumMember(Value = "My Value 3")]
    MyValueThree
}

当我序列化这个枚举时,我得到了正确的值,由属性 EnumMember 定义。所以在调用的结果中,我有一个 JSON 值 "My Value 1" 或 "My Value 2" 或 "My Value 3".

但是当我发回具有相同值的 JSON 时(例如 "My Value 1"),我收到此错误消息:

"The value 'My Value 1' is not valid for EnumModel." 

反序列化似乎没有使用 EnumMember 属性,因为当我发送值 "MyValueOne" 时,它起作用了。

我错过了什么?当我反序列化时,属性 [EnumMember()] 是如何工作的?

非常感谢您的帮助!

编辑:JSON 样本

{  
   "userName":"testuser@gmail.com",
   "enummodel":"My Value 1"
}

编辑 2:模型验证

抱歉,我忘了提一件重要的事情。我在我的控制器中使用 ModelState 验证:

if (!this.ModelState.IsValid)
{
    return this.BadRequest(this.ModelState);
}

我认为 json 使用属性 EnumMember 正确反序列化,但验证失败,因为验证器不使用 EnumMember 来验证我的模型?正确吗?

我的问题出在 ModelState 验证上,而不是反序列化上。 使用 EnumMember 属性,一切正常。

显然,ModelState 验证在验证时似乎没有读取 EnumMember 属性。但这是另一个主题:).

感谢您的帮助。