我正在使用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
属性。但这是另一个主题:)。
感谢您的帮助。