Я пытаюсь десериализовать JSON в список объектов с помощью .NET 3.1

#c# #json #json.net #json-deserialization

Вопрос:

У меня есть следующий Json:

 {
   "Id":"2727",
   "Region":"US",
   "Data":[
      {
         "Title":"Director",
         "JobDescription":"Coordinates the department activity",
         "Department":"HR"
      },
      {
         "Title":"Programmer",
         "JobDescription":"Enterprise software developer",
         "Department":"FR"
      }
   ]
}
 

Мой формат выглядит так:

 public class Data
{
    public string Title { get; set; }
    public string JobDescription { get; set; }
    public string Department { get; set; }
}

public class Format
{
    public string Id { get; set; }
    public string Region { get; set; }
    public List<Data> Data {get; set;}
}
 

Я попытался десериализовать его следующим образом:

 var  objects = JsonConvert.DeserializeObject<IEnumerable<Format>>(File.ReadAllText("mockJson.json")).ToList();
 

Я получаю это исключение:

Необработанное исключение типа » Newtonsoft.Json.Исключение JsonSerializationException’ произошло в Newtonsoft.Json.dll Невозможно десериализовать текущий объект JSON (например, {«имя»:»значение»}) в систему типа’.Коллекции.Общий.IEnumerable`1[Пример jsonparsing.Формат]’ , потому что для правильной десериализации типа требуется массив JSON (например, [1,2,3]). Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип, чтобы он был обычным .Тип СЕТКИ (например не примитивный тип, такой как integer, не тип коллекции, такой как массив или список), который может быть десериализован из объекта JSON. Атрибут JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON. Путь ‘GlobalOrgId’, строка 2, позиция 15.

Комментарии:

1. У вас нет списка Format s в вашем JSON. Это всего лишь один объект. Если вы ожидаете получить список, вам нужно окружить свой JSON «[]». И это именно то, что сообщение об ошибке пытается сказать вам довольно многословно.

2. Просто чтобы уточнить, что означает @Fildor, измените DeserializeObject<IEnumerable<Format>> на DeserializeObject<Format> , и это будет работать нормально. Или, если вы намеревались иметь список Format s, оберните json в массив: [ *your json* ] .

3. Спасибо, второй вариант решил мою проблему.

Ответ №1:

Просто публикую это в качестве ответа, потому что я думаю, что стоит сделать его более заметным. Я предполагал, что у вызова метода будут некоторые проблемы со списками вложенности внутри json, но я рад видеть, что это работает.

 Format format = JsonConvert.DeserializeObject<Format>(File.ReadAllText("mockJson.json"));
 

Я осмотрел элементы, и все они, похоже, находятся там, где и должны быть.

Просто будьте осторожны , потому JsonConvert.DeserializeObject<T> что возвращает объект типа T , а не IEnumerable<T> .

При работе с JSON в .NET я бы рекомендовал перейти к новым встроенным функциям.

https://devblogs.microsoft.com/dotnet/net-core-image-processing/