为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信