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.

Avinash
fonte

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);
har07
fonte
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;
John Peters
fonte
4

Não é possível adicionar um comentário à solução, mas isso não funcionou para mim. A solução que funcionou para mim foi usar:

var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass)); 
return des.data.Count.ToString();

Desserializando a matriz JSON em um objeto .NET fortemente tipado

TheNerdyNerd
fonte
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;
udorb b
fonte