Newtonsoft PopulateObject - 值不能为空异常

我正在尝试填充包含包含enum属性的对象的自定义可枚举的现有实例。当我这样做时,我System.ArgumentNullException: Value cannot be nullJsonConvert.PopulateObject(). 这可能是什么原因造成的?这是我的示例:

https://dotnetfiddle.net/CLYN3L

我正在尝试查看以下任何一项是否是原因:

  1. 在我的班上有枚举。

  2. 我的班级继承了IEnumeratorIEnumerable.

我有以下我无法控制的类和枚举。我无法更改它们:

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);

请让我知道有什么问题。如果您需要更多信息,请告诉我。


米琪卡哇伊
浏览 188回答 1
1回答

HUX布斯

您的基本问题是您已声明ErrorDTOas IEnumerator, IEnumerable,即无类型、非泛型可枚举。Json.NET 将这样的对象解释为只读的无类型集合,因此当您尝试填充它时,会出现异常:System.ArgumentNullException: Value cannot be null.&nbsp; &nbsp;at System.RuntimeType.MakeGenericType(Type[] instantiation)&nbsp; &nbsp;at Newtonsoft.Json.Serialization.JsonArrayContract.CreateWrapper(Object list)&nbsp; &nbsp;at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Populate(JsonReader reader, Object target)&nbsp; &nbsp;at Newtonsoft.Json.JsonSerializer.PopulateInternal(JsonReader reader, Object target)&nbsp; &nbsp;at Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target, JsonSerializerSettings settings)&nbsp; &nbsp;at Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target)异常消息无用且具有误导性,但真正的原因是 Json.NET 无法知道要反序列化到的集合项目的目标类型,或者在反序列化后添加它们的方法,对于任何无类型,只读集合。解决此类问题的正常方法是声明ErrorDTO为 anICollection<ErrorObj>并实现必要的泛型方法,从而将项目类型和Add()方法通知 Json.NET,但不幸的是,您声明我不能改变他们[类]。因此,最简单的解决方法是填充基础列表:Newtonsoft.Json.JsonConvert.PopulateObject(json, resultDTO.ErrorList);演示小提琴在这里。
打开App,查看更多内容
随时随地看视频慕课网APP