Não é possível desserializar a matriz JSON (por exemplo, [1,2,3]) no tipo '' porque o tipo requer o objeto JSON (por exemplo, {“nome”: “valor”}) para desserializar corretamente


99

Eu tenho este 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"
    }
]

E eu tenho essas aulas:

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; }
}

Estou tentando desserializar o JSON acima usando o código abaixo:

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

mas estou recebendo este erro:

Não é possível desserializar a matriz JSON atual (por exemplo, [1,2,3]) no tipo 'test.Model.RetrieveMultipleResponse' porque o tipo requer um objeto JSON (por exemplo, {"nome": "valor"}) para desserializar corretamente. Para corrigir esse erro, altere o JSON para um objeto JSON (por exemplo, {"nome": "valor"}) ou altere o tipo desserializado para uma matriz ou um tipo que implementa uma interface de coleção (por exemplo, ICollection, IList) como Lista que pode ser desserializado de uma matriz JSON. JsonArrayAttribute também pode ser adicionado ao tipo para forçá-lo a desserializar de uma matriz JSON. Caminho '', linha 1, posição 1.

Respostas:


160

Sua string json é colocada entre colchetes ( []), portanto, ela é interpretada como array em vez de RetrieveMultipleResponseobjeto único . Portanto, você precisa desserializá-lo para digitar a coleção de RetrieveMultipleResponse, por exemplo:

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

Tive que remover "//" antes de "[", então funcionou para mim. obrigado
berrante de

1
Se você quiser mantê-lo como um único objeto em vez de uma coleção, pode apenas fazer JsonStr.Replace ("[", ""). Replace ("]", "") ou isso não seria uma boa prática?
Rich

Para sua informação, isso não funcionou para mim porque eu estava obtendo meu JSON de uma API e tive a maldita URL errada por um dia inteiro. > <
w00ngy

1
O que é RetrieveMultipleResponse aqui?
Extremamente

Obrigado, isso funcionou para mim var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
StackBuddy

10

Se alguém quiser oferecer suporte a Genéricos (em um método de extensão), este é o padrão ...

public  static List<T> Deserialize<T>(this string SerializedJSONString)
{
    var stuff = JsonConvert.DeserializeObject<List<T>>(SerializedJSONString);
    return stuff;
}

É usado assim:

var rc = new MyHttpClient(URL);
//This response is the JSON Array (see posts above)
var response = rc.SendRequest();
var data = response.Deserialize<MyClassType>();

MyClassType se parece com isto (deve corresponder aos pares nome-valor da matriz 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; }
 }

Use o NUGET para baixar Newtonsoft.Json adicione uma referência onde necessário ...

using Newtonsoft.Json;



0

Use isto, FrontDataé uma string JSON:

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

e extrair lista:

var a = objResponse1[0];
var b = a.CustomerData;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.