簡體   English   中英

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

[英]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定義的正確值。 因此,在調用結果中,我有一個值為“我的值1”或“我的值2”或“我的值3”的JSON。

但是,當我以相同的值(例如,“我的值1”)發送回JSON時,會出現以下錯誤消息:

"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屬性。 但這是另一個主題:)。

謝謝您的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM