【问题标题】:Unable Deserialize the JSON List into List of Objects in C#无法将 JSON 列表反序列化为 C# 中的对象列表
【发布时间】:2020-06-17 16:36:41
【问题描述】:

我目前正在研究一种解决方案,该解决方案将来自json 数组的电子邮件列表反序列化,一旦获得电子邮件对象列表,我将使用另一个类进行验证,然后将其设置到另一个列表中。

下面是反序列化的代码:

static void Main(string[] args)
{
    string jsonTest = "{\"Emails\":[\"testUser@gmail.com\",\"testUser2@gmail.com\"]}";

    Class1 contact = JsonConvert.DeserializeObject<Class1>(jsonTest);

    Console.WriteLine(contact.Emails[0]);
    Console.WriteLine(contact.Emails[1]);
}

并且,下面是用于反序列化的 Class1 的类定义:

public class Class1
{
    private readonly List<ValidateEmail> emailsobj;
    public List<string> Emails
    {
        get
        {
            return emailsobj.Select(o => o.EmailAdd).ToList();
        }
        set
        {
            foreach (string email in value)
            {
                emailsobj.Add(new ValidateEmail(email));
            }
        }
    }
}

下面是validate 类:

public class ValidateEmail
{
    public string EmailAdd { get; set; }
    private bool Valid;

    public ValidateEmail(string value)
    {           
        try
        {
            MailAddress mail = new MailAddress(EmailAdd);
            EmailAdd = value;
            Valid = true;
        }
        catch (FormatException)
        {
            Valid = false;
        }
    }
}

每当我反序列化时,我都会在线收到异常:

Console.WriteLine(contact.Emails[0]);

Newtonsoft.Json.JsonSerializationException: 获取值时出错 “JsonGenerator.Class1”上的“电子邮件”。 ---> System.ArgumentNullException: 值不能为空。 (参数'来源')

看起来List&lt;Email&gt; 从未设置。对此有任何帮助,将不胜感激。

【问题讨论】:

  • 请告知您遇到了什么错误?此行将失败 - JsonConvert.DeserializeObject(jsonTest);因为类 1 中的 emailsobj 为空,什么是 MailAddress 类?
  • 是的,你是正确的 Mahesh。我收到了空引用错误消息。 MailAddress 是内置类,它是 system.net.email 的一部分。用于验证电子邮件。我刚刚更改为私有 List emailsobj = new List()。还是失败了。任何想法?如果您指出我的错误,那就太好了。引发以下错误,未处理的异常。 Newtonsoft.Json.JsonSerializationException:从“JsonGenerator.Class1”上的“电子邮件”获取值时出错。 ---> System.ArgumentNullException:值不能为空。 (参数“来源”)

标签: c# arrays list deserialization


【解决方案1】:

如果您使用列表 - ObjectCreationHandling,则必须设置以下设置(替换)。

Replace 始终创建新对象并启用Lists 的setter 属性!

所以在您初始化Class1 中的新列表后,如下所示:

private readonly List<ValidateEmail> emailsobj = new List<ValidateEmail>();

更改代码以进行设置:

 var settings = new JsonSerializerSettings
      {                
         ObjectCreationHandling = ObjectCreationHandling.Replace           
      };

 Class1 contact = JsonConvert.DeserializeObject<Class1>(jsonTest, settings);

详细解释见here

【讨论】:

    猜你喜欢
    • 2016-05-30
    • 2022-12-13
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多