Подтвердить что ты не робот

Невозможно десериализовать массив 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.

4b9b3361

Ответ 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