Невозможно десериализовать массив JSON (например, [1,2,3]) в тип '', потому что для типа требуется объект JSON (например, { "name": "value" }) для десериализации правильно
У меня есть Json, как показано ниже:
[
{
"Attributes": [
{
"Key": "Name",
"Value": {
"Value": "Acc 1",
"Values": [
"Acc 1"
]
}
},
{
"Key": "Id",
"Value": {
"Value": "1",
"Values": [
"1"
]
}
}
],
"Name": "account",
"Id": "1"
},
{
"Attributes": [
{
"Key": "Name",
"Value": {
"Value": "Acc 2",
"Values": [
"Acc 2"
]
}
},
{
"Key": "Id",
"Value": {
"Value": "2",
"Values": [
"2"
]
}
}
],
"Name": "account",
"Id": "2"
},
{
"Attributes": [
{
"Key": "Name",
"Value": {
"Value": "Acc 3",
"Values": [
"Acc 3"
]
}
},
{
"Key": "Id",
"Value": {
"Value": "3",
"Values": [
"3"
]
}
}
],
"Name": "account",
"Id": "2"
}
]
для этого я У вас есть класс, как показано ниже:
public class RetrieveMultipleResponse
{
public List<Attribute> Attributes { get; set; }
public string Name { get; set; }
public string Id { get; set; }
}
public class Value
{
[JsonProperty("Value")]
public string value { get; set; }
public List<string> Values { get; set; }
}
public class Attribute
{
public string Key { get; set; }
public Value Value { get; set; }
}
Я пытаюсь десериализовать вышеупомянутый json, используя ниже код:
var objResponse1 = JsonConvert.DeserializeObject<RetrieveMultipleResponse>(JsonStr);
но я получаю ниже ошибки:
Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'test.Model.RetrieveMultipleResponse', потому что для типа требуется JSON объект (например, { "name": "value" }) для десериализации. Чтобы исправить это ошибка либо изменяет JSON на объект JSON (например, { "name": "value" }) или изменить десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList), например List, который может десериализоваться из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON. Дорожка '', строка 1, позиция 1.
Ответы
Ответ 1
Ваша строка json заключена в квадратные скобки ([]
), поэтому она интерпретируется как массив вместо одиночного объекта RetrieveMultipleResponse
. Поэтому вам нужно десериализовать его, чтобы набрать коллекцию RetrieveMultipleResponse
, например:
var objResponse1 =
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);
Ответ 2
Если вы хотите поддерживать Generics (в методе расширения), это шаблон...
public static List<T> Deserialize<T>(this string SerializedJSONString)
{
var stuff = JsonConvert.DeserializeObject<List<T>>(SerializedJSONString);
return stuff;
}
Он используется следующим образом:
var rc = new MyHttpClient(URL);
//This response is the JSON Array (see posts above)
var response = rc.SendRequest();
var data = response.Deserialize<MyClassType>();
MyClassType выглядит так (должен совпадать с парами значений имени массива JSON)
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class MyClassType
{
[JsonProperty(PropertyName = "Id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "Name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "Description")]
public string Description { get; set; }
[JsonProperty(PropertyName = "Manager")]
public string Manager { get; set; }
[JsonProperty(PropertyName = "LastUpdate")]
public DateTime LastUpdate { get; set; }
}
Используйте NUGET для загрузки Newtonsoft.Json добавьте ссылку, где необходимо...
using Newtonsoft.Json;
Ответ 3
Невозможно добавить комментарий к решению, но это не сработало для меня. Решение, которое работало для меня, состояло в том, чтобы использовать:
var des = (МойКласс) Newtonsoft.Json.JsonConvert.DeserializeObject(ответ, TypeOf (МойКласс));
return des.data.Count.ToString();
десериализация массива JSON в строго типизированный объект .NET