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