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



我正在使用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 定义。因此,在调用的结果中,我有一个值为"我的值 1"或"我的值 2"或"我的值 3"的 JSON。

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

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

它似乎不使用 EnumMember 属性进行反序列化,因为当我发送值"MyValueOne"时,它可以工作。

我错过了什么?反序列化时属性[EnumMember()]如何真正工作?

非常感谢您的帮助!

编辑:JSON 示例

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

编辑2:模型验证

对不起,但我忘了提到一件重要的事情。我在我的控制器中使用了模型状态验证:

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

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

我的问题在于模型状态验证,而不是反序列化。使用 EnumMember 属性,一切正常。

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

感谢您的帮助。

相关内容

  • 没有找到相关文章

最新更新