C # JSON десериализовать в сложный класс - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть JSON, подобный этому

    {
  "Application": [
    {
      "Office": "London",
      "LogPath": [
        "\\\\server1\filepath\\"           
      ]
    },
    {
      "Office": "Paris",
      "LogPath": [
        "\\\\server2\\logpath1\\",
        "\\\\server2\\logpath2\\"
      ]
    }
  ],
  "MailSettings": {
    "MailTo": "mymail@mydomain.it",
    "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"}) для правильной десериализации.

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

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018

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

0 голосов
/ 27 ноября 2018

Вы можете генерировать типы, используя 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 могут получить ту же самую функцию, используя JSON, как расширение кода , работающее на QuickType.

0 голосов
/ 27 ноября 2018

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

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

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

0 голосов
/ 27 ноября 2018

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

 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; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...