Невозможно десериализовать список JSON в список объектов в C# - PullRequest
0 голосов
/ 17 июня 2020

В настоящее время я работаю над решением, которое десериализует список электронной почты из массива 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 class:

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: значение не может быть нулевым. (Параметр 'source')

Похоже, что List<Email> никогда не устанавливалось. Любая помощь по этому поводу была бы очень признательна.

1 Ответ

1 голос
/ 18 июня 2020

Если вы используете списки, вам необходимо установить следующие настройки (Заменить) - ObjectCreationHandling.

Replace Всегда создавать новые объекты и включает свойство setter для Lists!

Итак, после инициализации нового списка в Class1, как показано ниже:

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

Измените код, чтобы получить настройку:

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

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

См. Подробное объяснение здесь !

...