Десериализовать json в IEnumerable в ядре C# asp .net

У меня есть объект json. Я хочу десериализовать его до объекта типа IEnumerable.

Я работаю в asp.net Core.

Я пытаюсь это сделать:

IEnumerable div = (IEnumerable)JsonConvert.DeserializeObject(value, typeof(IEnumerable));

Здесь значение - это переменная json.

У меня такое исключение:

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.IEnumerable' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

Файл Json:

{
  "name": "xx",
  "place": {
    "native": "aa",
    "school": "ee",
    "college": "dd"
  },
  "dob": "ss",
  "ids": [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
    21,
    22,
    23,
    24,
    25,
    26,
    27,
    28,
    29,
    30,
    31,
    32,
    33,
    34,
    35,
    36,
    37,
    38,
    39,
    40,
    41,
    42,
    43,
    44,
    45,
    46,
    47,
    48,
    49,
    50,
    51,
    52,
    53,
    54,
    55,
    56,
    57,
    58,
    59,
    60,
    61,
    62,
    63,
    64,
    65,
    66,
    67,
    68,
    69,
    70,
    71,
    72,
    73,
    74,
    75,
    76,
    77,
    78,
    79,
    80,
    81,
    82,
    83,
    84,
    85,
    86,
    87,
    88,
    89,
    90,
    91,
    92,
    93,
    94,
    95,
    96,
    97,
    98,
    99,
    100,
    101,
    102,
    103,
    104,
    105,
    106,
    107,
    108,
    109,
    110,
    111,
    112,
    113,
    114,
    115,
    116,
    117,
    118,
    119,
    120
  ],
  "mark": [
    {
      "10thmark": "345",
      "12thmark": "1100"
    },
    {
      "Diploma": "G",
      "Diploma PG": "R"
    },
    {
      "Ug": "D",
      "PG": "E"
    }
  ]
}

Как решить эту проблему?

Если строка JSON содержит массив, результатом будет массив. Тип IEnumerable указывать не нужно.

Panagiotis Kanavos 16.07.2018 11:59

Пожалуйста, предоставьте код и JSON, если он все еще не исправлен.

Jyothish Bhaskaran 16.07.2018 12:01

Если ваш ввод содержит один объект в строке без скобок, это НЕТ допустимый файл JSON. Не стоит пытаться десериализовать все сразу. Эта форма предназначена для потоковой передачи большого количества объектов без необходимости чтения всей строки. Вместо этого читайте и анализируйте по одной строке за раз.

Panagiotis Kanavos 16.07.2018 12:04

@JyothishBhaskaran, я прикрепил файл Json. См. Выше.

Nivitha Gopalakrishnan 16.07.2018 13:29

@Nivitha Gopalakrishnan, вы не можете десериализовать его напрямую с помощью IEnumrable, если вы внимательно посмотрите свой json, это пара ключевых значений, и вам нужна модель представления, для этого, пожалуйста, посмотрите мой ответ, это может вам помочь

er-sho 16.07.2018 13:35

@Nivitha Gopalakrishnan, вы просто помещаете свой json и создаете модель представления, как выглядит json, тогда вы сможете правильно десериализовать

er-sho 16.07.2018 13:38

Я думаю, вы можете добиться этого напрямую. Я столкнулся с одной проблемой, похожей на эту несколько месяцев назад. См. Эту ссылку. stackoverflow.com/questions/49895597/…

Jyothish Bhaskaran 16.07.2018 17:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
8 549
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

1) Если ваш json является объектом например MyUser

public class MyUser
{
    public int Id { get; set; }    
    public string Name { get; set; }    
    public string Description { get; set; }
}

и ваш json

{
   "Id": 1,
   "Name": "Andrew",
   "Description": "Software Engineer"
}

то вы легко десериализуете, используя приведенный ниже код

MyUser user = JsonConvert.DeserializeObject<MyUser>(data);

"data" в приведенном выше коде - это данные вашего файла json.

2) Если ваш json представляет собой массив объектов вроде например Массив MyUser.

{
  "Users": [
    { "Id": 1, "Name": "Andrew", "Description": "Software Engineer"},
    { "Id": 2, "Name": "Eddy", "Description": "Software Developer"},
    { "Id": 3, "Name": "Matthew", "Description": "Web Developer"}
  ]
}

тогда вам нужна модель представления свойства типа IEnumerable MyUser для десериализации, например

public class MyUserVM
{
    public IEnumerable<MyUser> Users { get; set; }
}

а затем вам нужно десериализовать, используя указанную выше модель представления, например

MyUserVM users = JsonConvert.DeserializeObject<MyUserVM>(data);

"data" в приведенном выше коде - это данные вашего файла json.

В) Почему здесь нужна модель просмотра?

A) Поскольку json является текстовыми данными в формате ключевого значения, и вам нужен ключ для его чтения в классе JsonConvert.

Отредактировано:

вы, пожалуйста, измените свои ключи json, как показано ниже

{
  "name": "xx",
  "place": {
    "native": "aa",
    "school": "ee",
    "college": "dd"
  },
  "dob": "ss",
  "ids": [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
    21,
    22,
    23,
    24,
    25,
    26,
    27,
    28,
    29,
    30,
    31,
    32,
    33,
    34,
    35,
    36,
    37,
    38,
    39,
    40,
    41,
    42,
    43,
    44,
    45,
    46,
    47,
    48,
    49,
    50,
    51,
    52,
    53,
    54,
    55,
    56,
    57,
    58,
    59,
    60,
    61,
    62,
    63,
    64,
    65,
    66,
    67,
    68,
    69,
    70,
    71,
    72,
    73,
    74,
    75,
    76,
    77,
    78,
    79,
    80,
    81,
    82,
    83,
    84,
    85,
    86,
    87,
    88,
    89,
    90,
    91,
    92,
    93,
    94,
    95,
    96,
    97,
    98,
    99,
    100,
    101,
    102,
    103,
    104,
    105,
    106,
    107,
    108,
    109,
    110,
    111,
    112,
    113,
    114,
    115,
    116,
    117,
    118,
    119,
    120
  ],
  "mark": [
    {
      "tenthmark": "345",
      "twelthmark": "1100"
    },
    {
      "Diploma": "G",
      "DiplomaPG": "R"
    },
    {
      "Ug": "D",
      "PG": "E"
    }
  ]
}

и используйте представленные ниже модели, которые я создал для вас

public class Place
{
    public string native { get; set; }
    public string school { get; set; }
    public string college { get; set; }
}

public class Mark
{
    public string tenthmark { get; set; }
    public string twelthmark { get; set; }
    public string Diploma { get; set; }
    public string DiplomaPG { get; set; }
    public string Ug { get; set; }
    public string PG { get; set; }
}

public class RootObject
{
    public string name { get; set; }
    public Place place { get; set; }
    public string dob { get; set; }
    public List<int> ids { get; set; }
    public List<Mark> mark { get; set; }
}

а затем десериализовать с помощью

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

открытый класс MyUserVM {общедоступные IEnumerable <строка> Пользователи {получить; набор; }} MyUserVM users = JsonConvert.DeserializeObject <MyUserVM> (значение);

Nivitha Gopalakrishnan 16.07.2018 13:42

@Nivitha Gopalakrishnan, не могли бы вы переименовать некоторые свойства, такие как "10thmark" или "12thmark", в чистые строки и "Diploma PG" без пробелов. и попробуй еще раз

er-sho 16.07.2018 14:10

Вы не можете десериализовать интерфейс, вы можете десериализовать только конкретный тип, такой как List of T

Это неправда - вы МОЖЕТЕ десериализовать интерфейс, вам просто нужно иметь специальный конвертер для его обработки.

user2338408 17.03.2021 13:42

Вы не можете просто десериализовать в IEnumerable ... вам нужна модель для размещения данных. Вам нужна ViewModel, которая отражает вашу структуру JSON, а затем вы можете легко десериализовать ее в IEnumerable вашего типа ViewModel.

JsonConvert.DeserializeObject<IEnumerable<SomeViewModel>>(jsonData)

Было бы полезно немного пояснения.

Mary 17.07.2018 00:19

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