У меня есть объект 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, если он все еще не исправлен.
Если ваш ввод содержит один объект в строке без скобок, это НЕТ допустимый файл JSON. Не стоит пытаться десериализовать все сразу. Эта форма предназначена для потоковой передачи большого количества объектов без необходимости чтения всей строки. Вместо этого читайте и анализируйте по одной строке за раз.
@JyothishBhaskaran, я прикрепил файл Json. См. Выше.
@Nivitha Gopalakrishnan, вы не можете десериализовать его напрямую с помощью IEnumrable, если вы внимательно посмотрите свой json, это пара ключевых значений, и вам нужна модель представления, для этого, пожалуйста, посмотрите мой ответ, это может вам помочь
@Nivitha Gopalakrishnan, вы просто помещаете свой json и создаете модель представления, как выглядит json, тогда вы сможете правильно десериализовать
Я думаю, вы можете добиться этого напрямую. Я столкнулся с одной проблемой, похожей на эту несколько месяцев назад. См. Эту ссылку. stackoverflow.com/questions/49895597/…





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, не могли бы вы переименовать некоторые свойства, такие как "10thmark" или "12thmark", в чистые строки и "Diploma PG" без пробелов. и попробуй еще раз
Вы не можете десериализовать интерфейс, вы можете десериализовать только конкретный тип, такой как List of T
Это неправда - вы МОЖЕТЕ десериализовать интерфейс, вам просто нужно иметь специальный конвертер для его обработки.
Вы не можете просто десериализовать в IEnumerable ... вам нужна модель для размещения данных. Вам нужна ViewModel, которая отражает вашу структуру JSON, а затем вы можете легко десериализовать ее в IEnumerable вашего типа ViewModel.
JsonConvert.DeserializeObject<IEnumerable<SomeViewModel>>(jsonData)
Было бы полезно немного пояснения.
Если строка JSON содержит массив, результатом будет массив. Тип
IEnumerableуказывать не нужно.