C# JSON десериализация в сложный класс

У меня есть такой JSON

    {
  "Application": [
    {
      "Office": "London",
      "LogPath": [
        "\\\\server1\filepath\\"           
      ]
    },
    {
      "Office": "Paris",
      "LogPath": [
        "\\\\server2\\logpath1\\",
        "\\\\server2\\logpath2\\"
      ]
    }
  ],
  "MailSettings": {
    "MailTo": "[email protected]",
    "MailSubject" :  "Log Checker"
  } 
}

и я создал собственный класс для чтения содержимого json:

public class RootObject
  {
    public Application Application { get; set; }
    public MailSettings MailSettings { get; set; }
  }

  public class Application
  {
    public List<Offices> Offices { get; set; }
  }

  public class Offices
  {
    public string Office{ get; set; }
    public IList<string> LogPath { get; set; }
  }

  public class MailSettings
  {
    public string MailTo { get; set; }
    public string MailSubject { get; set; }
  }

Но когда я пытаюсь десериализовать json с помощью

RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(json);

Возвращаю ошибку: типу требуется объект JSON (например, {"name": "value"}) для правильной десериализации.

Что не так с моим пользовательским классом?

Ваш JSON не соответствует структуре вашего класса. Например, ваш JSON имеет массив свойств Application, а в структуре вашего класса есть один Application, который имеет List<String> offices.

jAC 27.11.2018 12:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
77
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Ваши пользовательские классы должны быть такими же.

 public class Application
    {
        public string Office { get; set; }
        public List<string> LogPath { get; set; }
    }

    public class MailSettings
    {
        public string MailTo { get; set; }
        public string MailSubject { get; set; }
    }

    public class RootObject
    {
        public List<Application> Application { get; set; }
        public MailSettings MailSettings { get; set; }
    }

Вы можете генерировать типы с помощью json2csharp - чтобы не создавать вручную представление объекта JSON.

public class RootObject
{
    public List<Application> Application { get; set; }
    public MailSettings MailSettings { get; set; }
}

public class Application
{
    public string Office { get; set; }
    public List<string> LogPath { get; set; }
}

public class MailSettings
{
    public string MailTo { get; set; }
    public string MailSubject { get; set; }
}

Использование Visual Studio «Вставить JSON как классы» дает такие же функциональные возможности, но немного другие:

    public class Rootobject
    {
        public Application[] Application { get; set; }
        public Mailsettings MailSettings { get; set; }
    }

    public class Mailsettings
    {
        public string MailTo { get; set; }
        public string MailSubject { get; set; }
    }

    public class Application
    {
        public string Office { get; set; }
        public string[] LogPath { get; set; }
    }

Пользователи Visual Studio Code могут получить ту же функцию с помощью JSON как расширение кода на базе QuickType.

Скопируйте строку json и используйте встроенную функцию Visual Studio, чтобы создать собственный класс для соответствующего json.

- Перейти к редактированию -> Специальная вставка -> Вставить JSON как класс

Это создаст для вас собственный класс. Теперь, используя библиотеку Newtonsoft.Json, вы можете десериализовать свой json.

Я протестировал ваш код. Ваша проблема в вашей модели RootObject. В вашем RootObject у вас есть набор приложений, а не одно приложение. Я поменял его, и он работал правильно.

Другие вопросы по теме