No se puede deserializar la matriz JSON (por ejemplo, [1,2,3]) en el tipo '' porque el tipo requiere que el objeto JSON (por ejemplo, {“nombre”: “valor”}) se deserialice correctamente

99

Tengo 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"
    }
]

Y tengo estas clases:

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

Estoy tratando de deserializar el JSON anterior usando el siguiente código:

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

pero recibo este error:

No se puede deserializar la matriz JSON actual (por ejemplo, [1,2,3]) en el tipo 'test.Model.RetrieveMultipleResponse' porque el tipo requiere un objeto JSON (por ejemplo, {"nombre": "valor"}) para deserializar correctamente. Para corregir este error, cambie el JSON a un objeto JSON (por ejemplo, {"nombre": "valor"}) o cambie el tipo deserializado a una matriz o un tipo que implemente una interfaz de colección (por ejemplo, ICollection, IList) como List que puede ser deserializado desde una matriz JSON. JsonArrayAttribute también se puede agregar al tipo para forzarlo a deserializar desde una matriz JSON. Path '', línea 1, posición 1.

Avinash
fuente

Respuestas:

160

Su cadena json está envuelta entre corchetes ( []), por lo tanto, se interpreta como una matriz en lugar de un solo RetrieveMultipleResponseobjeto. Por lo tanto, debe deserializarlo para escribir una colección de RetrieveMultipleResponse, por ejemplo:

var objResponse1 = 
    JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);
har07
fuente
Tuve que eliminar "//" antes de "[", luego funcionó para mí. gracias
chillón
1
Si quisiera mantenerlo como un solo objeto en lugar de una colección, ¿podría simplemente hacer JsonStr.Replace ("[", ""). Reemplazar ("]", "") o no sería una buena práctica?
Rich
Para su información, esto no funcionó para mí porque estaba obteniendo mi JSON de una API y tuve la maldita URL incorrecta durante todo un día. > <
w00ngy
1
¿Qué es RetrieveMultipleResponse aquí?
Curiosamente
Gracias, esto funcionó para mí var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
StackBuddy
10

Si uno quiere admitir Genéricos (en un método de extensión), este es el patrón ...

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

Se usa así:

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 ve así (debe coincidir con los pares de nombre y valor de la 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 NUGET para descargar Newtonsoft.Json agregue una referencia donde sea necesario ...

using Newtonsoft.Json;
John Peters
fuente
0

Use esto, FrontDataes una cadena JSON:

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

y extraer lista:

var a = objResponse1[0];
var b = a.CustomerData;
udorb b
fuente