Неможливо десеріалізувати масив JSON (наприклад, [1,2,3]) у тип '', тому що для типу потрібен об'єкт JSON (наприклад, {"ім'я": "значення"}), щоб деріаріалізувати правильно


99

У мене є цей 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.

Відповіді:


160

Ваша рядок json загорнута в квадратні дужки ( []), отже, вона інтерпретується як масив замість одного RetrieveMultipleResponseоб'єкта. Тому вам потрібно десаріалізувати його для типу колекції RetrieveMultipleResponse, наприклад:

var objResponse1 = 
    JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);

Мені довелося видалити "//" befor "[", тоді це працювало на мене. спасибі
garish

1
Якщо ви хочете зберегти його як єдиний об'єкт замість колекції, чи можете ви просто зробити JsonStr.Replace ("[", ""). Замінити ("]", "") чи це не буде гарною практикою?
Багатий

FYI, це не спрацювало для мене, тому що я отримував JSON від API, і у мене був невірний URL неправильно протягом цілого дня. > <
w00ngy

1
Що тут RetrieveMultipleResponse?
Чудово

Дякую, це працювало для мене var objResponse1 = JsonConvert.DeserializeObject <Список <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
StackBuddy

10

Якщо ви хочете підтримати 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;


0
var objResponse1 = 
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);

працювали!


Це не дає відповіді на запитання. Коли у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію ; натомість надайте відповіді, які не потребують уточнення від запитувача . - З огляду
mike

0

Використовуйте це, FrontDataце рядок JSON:

var objResponse1 = JsonConvert.DeserializeObject<List<DataTransfer>>(FrontData);  

і витяг списку:

var a = objResponse1[0];
var b = a.CustomerData;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.