У меня такой 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.
Если кто-то хочет поддерживать 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;
источник
Не могу добавить комментарий к решению, но у меня это не сработало. Решение, которое сработало для меня, заключалось в использовании:
Десериализация массива JSON в строго типизированный объект .NET
источник
var objResponse1 = JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);
работал!
источник
Используйте это,
FrontData
это строка JSON:var objResponse1 = JsonConvert.DeserializeObject<List<DataTransfer>>(FrontData);
и извлечь список:
var a = objResponse1[0]; var b = a.CustomerData;
источник