web-dev-qa-db-fra.com

Impossible de désérialiser l'objet JSON actuel (par exemple {"name": "value"}) en type 'System.Collections.Generic.List`1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Facebook;
using Newtonsoft.Json;

namespace facebook
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new FacebookClient(acc_ess);
            dynamic result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"});
            string jsonstring = JsonConvert.SerializeObject(result);

            //jsonstring {"data":[{"target_id":9503123,"target_type":"user"}]}
            List<RootObject> datalist = JsonConvert.DeserializeObject<List<RootObject>>(jsonstring);
        }

        public class Datum
        {
            public Int64 target_id { get; set; }
            public string target_type { get; set; }
        }

        public class RootObject
        {          
            public List<Datum> data { get; set; }
        }
    }
}

Impossible de désérialiser l'objet JSON actuel (par exemple, {"name": "value"}) en type 'System.Collections.Generic.List`1 [facebook.Program + RootObject]' car ce type nécessite un tableau JSON (par exemple, [1, 2,3]) pour désérialiser correctement. Pour corriger cette erreur, remplacez le JSON par un tableau JSON (par exemple, [1,2,3]) ou modifiez le type désérialisé de sorte qu'il s'agisse d'un type .NET normal (par exemple, pas un type primitif comme entier, ni un type de collection comme un tableau ou une liste) qui peut être

J'ai regardé d'autres messages.

Mon json ressemble à ceci:

{"data":[{"target_id":9503123,"target_type":"user"}]}
37
user3236519

Pour que ce soit clair, en plus de la réponse de @SLaks, cela signifiait que vous deviez changer cette ligne:

List<RootObject> datalist = JsonConvert.DeserializeObject<List<RootObject>>(jsonstring);

à quelque chose comme ça:

RootObject datalist = JsonConvert.DeserializeObject<RootObject>(jsonstring);
41
har07

Comme le message d'erreur tente très difficilement de vous l'indiquer, vous ne pouvez pas désérialiser un seul objet dans une collection (List<>).

Vous voulez désérialiser en un seul RootObject.

12
SLaks

Pouvez-vous essayer de changer votre json sans la touche data comme ci-dessous?

{[{"target_id":9503123,"target_type":"user"}]}
2
ddagsan

Cela m'est arrivé aussi, parce que j'essayais d'obtenir un IEnumerable, mais que la réponse avait une valeur unique. S'il vous plaît essayez de vous assurer qu'il s'agit d'une liste de données dans votre réponse. Les lignes que j'ai utilisées (pour api url get) pour résoudre le problème sont les suivantes:

HttpResponseMessage response = await client.GetAsync("api/yourUrl");

if (response.IsSuccessStatusCode)
{
    IEnumerable<RootObject> rootObjects =
        awaitresponse.Content.ReadAsAsync<IEnumerable<RootObject>>();

    foreach (var rootObject in rootObjects)
    {
        Console.WriteLine(
            "{0}\t${1}\t{2}",
            rootObject.Data1, rootObject.Data2, rootObject.Data3);
    }

    Console.ReadLine();
}

J'espère que ça aide.

2
Nelson Parra

Le vrai problème est que vous utilisez le type dynamic return dans le compte FacebookClient méthode Get. Et bien que vous utilisiez une méthode de sérialisation, le convertisseur JSON ne peut pas désérialiser cet objet par la suite.

Utilisation au lieu de:

dynamic result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"}); 
string jsonstring = JsonConvert.SerializeObject(result);

quelque chose comme ca:

string result = client.Get("fql", new { q = "select target_id,target_type from connection where source_id = me()"}).ToString();

Ensuite, vous pouvez utiliser la méthode DeserializeObject:

var datalist = JsonConvert.DeserializeObject<List<RootObject>>(result);

J'espère que cela t'aides.

0
Rawson