亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Newtonsoft PopulateObject - 值不能為空異常

Newtonsoft PopulateObject - 值不能為空異常

C#
米琪卡哇伊 2022-07-23 18:01:13
我正在嘗試填充包含包含enum屬性的對象的自定義可枚舉的現有實例。當我這樣做時,我System.ArgumentNullException: Value cannot be null從JsonConvert.PopulateObject(). 這可能是什么原因造成的?這是我的示例:https://dotnetfiddle.net/CLYN3L我正在嘗試查看以下任何一項是否是原因:在我的班上有枚舉。我的班級繼承了IEnumerator, IEnumerable.我有以下我無法控制的類和枚舉。我無法更改它們:public enum ErrorDisplayType : int {    PopUp = 0,    ErrorPane = 1,    Statusbar = 2}[Serializable()]public class ErrorObj {   private string errorCode;   private ErrorDisplayType errorDispType;   public string ErrorCode    {     get { return this.errorCode; }     set {        this.errorCode = value;        if (errorCode != null)        {           this.setFields(errorCode);        }     }   }   public ErrorDisplayType ErrorDispType    {      get { return this.errorDispType; }      set { this.errorDispType = value; }   }    private void setFields(string errorCode)     {       this.errorDispType = (ErrorDisplayType)int.Parse(errorCode);    }   }[Serializable]public class ErrorDTO : IEnumerator, IEnumerable {   private int indx = -1;   private List<ErrorObj> errorList;   public List<ErrorObj> ErrorList    {     get { return this.errorList; }     set { this.errorList = value; }   }   public ErrorDTO()   {        this.errorList = new List<ErrorObj>();   }   public int Add(ErrorObj error)   {    this.errorList.Add(error);    return 0;     }   public bool MoveNext()   {      if (indx < errorList.Count - 1)            {                                             ++indx;                                   return true;                           }                                          else                                       {                                             indx = -1;                                return false;                          }                                        }下面是我的代碼,我正在嘗試反序列化ErrorDTO errorDTO = new ErrorDTO();string jsonString = GetErrorJSON();下面的行會引發我的錯誤。System.ArgumentNullException:值不能為空。Newtonsoft.Json.JsonConvert.PopulateObject(jsonString, errorDTO);請讓我知道有什么問題。如果您需要更多信息,請告訴我。
查看完整描述

1 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

您的基本問題是您已聲明ErrorDTOas IEnumerator, IEnumerable,即無類型、非泛型可枚舉。Json.NET 將這樣的對象解釋為只讀的無類型集合,因此當您嘗試填充它時,會出現異常:


System.ArgumentNullException: Value cannot be null.

   at System.RuntimeType.MakeGenericType(Type[] instantiation)

   at Newtonsoft.Json.Serialization.JsonArrayContract.CreateWrapper(Object list)

   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Populate(JsonReader reader, Object target)

   at Newtonsoft.Json.JsonSerializer.PopulateInternal(JsonReader reader, Object target)

   at Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target, JsonSerializerSettings settings)

   at Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target)

異常消息無用且具有誤導性,但真正的原因是 Json.NET 無法知道要反序列化到的集合項目的目標類型,或者在反序列化后添加它們的方法,對于任何無類型,只讀集合。


解決此類問題的正常方法是聲明ErrorDTO為 anICollection<ErrorObj>并實現必要的泛型方法,從而將項目類型和Add()方法通知 Json.NET,但不幸的是,您聲明


我不能改變他們[類]。


因此,最簡單的解決方法是填充基礎列表:


Newtonsoft.Json.JsonConvert.PopulateObject(json, resultDTO.ErrorList);

演示小提琴在這里。


查看完整回答
反對 回復 2022-07-23
  • 1 回答
  • 0 關注
  • 213 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號