2 votes

Impossible d'analyser le fichier json pour obtenir la liste des objets personnalisés.

J'essaie d'analyser ma réponse json qui ressemble à celle-ci :

{
"response":
    {
    "status":"ok",
    "userTier":"developer",
    "total":12075,
    "startIndex":1,
    "pageSize":10,
    "currentPage":1,
    "pages":1208,
    "orderBy":"relevance",
    "results":[
        {
        "type":"article",
        "sectionId":"world",
        "webTitle":"Putin-themed cafe opens in Siberia",
        "webPublicationDate":"2016-04-13T14:56:42Z",
        "id":"world/2016/apr/13/vladimir-putin-themed-cafe-opens-in-siberia",
        "webUrl":"http://www.theguardian.com/world/2016/apr/13/vladimir-putin-themed-cafe-opens-in-siberia",
        "apiUrl":"http://content.guardianapis.com/world/2016/apr/13/vladimir-putin-themed-cafe-opens-in-siberia",
        "sectionName":"World news"
        },
        {
        "type":"article",
        "sectionId":"world",
        "webTitle":"Spain issues arrest warrants for Russian officials close to Putin",
        "webPublicationDate":"2016-05-04T16:59:27Z",
        "id":"world/2016/may/04/spain-issues-arrest-warrants-for-russian-officials-close-to-putin",
        "webUrl":"http://www.theguardian.com/world/2016/may/04/spain-issues-arrest-warrants-for-russian-officials-close-to-putin",
        "apiUrl":"http://content.guardianapis.com/world/2016/may/04/spain-issues-arrest-warrants-for-russian-officials-close-to-putin",
        "sectionName":"World news"
        }

J'ai créé mes classes en utilisant json2csharp.com (Insérer cette chaîne : http://content.guardianapis.com/search?q=putin&api-key=6392a258-3c53-4e76-87ec-e9092356fa74 ) Mais j'ai eu l'erreur suivante lorsque j'ai essayé de l'analyser :

var model = JsonConvert.DeserializeObject<List<NewsModel.RootObject>>(data);

En fait, j'ai obtenu mes données de cette façon :

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://content.guardianapis.com/search?q=putin&api-key=6392a258-3c53-4e76-87ec-e9092356fa74");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
   Stream receiveStream = response.GetResponseStream();
   StreamReader readStream = null;

   if (response.CharacterSet == "")
       readStream = new StreamReader(receiveStream);
   else
       readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));

       string data = readStream.ReadToEnd();
       DataSet ds = new DataSet();
       StringReader reader = new StringReader(data);

// parse here
}

Quelque chose de mauvais avec l'analyse json. Message : Impossible de désérialiser l'objet l'objet JSON actuel (par exemple, {"nom" : "valeur"}) dans le type System.Collections.Generic.List 1[sample.NewsModel+RootObject]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. Path 'response', line 1, position 12.Something bad with json parsing. Message: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List 1[sample.NewsModel+RootObject] car le type nécessite un tableau JSON (par exemple [1,2,3]) pour être désérialisé correctement. correctement. Pour corriger cette erreur, il faut soit changer le JSON en un tableau JSON (par exemple, [1,2,3]) ou bien modifiez le type désérialisé pour qu'il soit un type normal de NET normal (par exemple, pas un type primitif comme integer, pas un type de collection comme un tableau ou une liste) qui ne peut pas être modifié. comme un tableau ou une liste) qui peut être désérialisé d'un objet JSON. JSON. L'attribut JsonObjectAttribute peut également être ajouté au type pour l'obliger à pour le forcer à se désérialiser à partir d'un objet JSON. Chemin 'response', ligne 1, position 12.

2voto

Martin Costello Points 4557

Il semble que vous essayez de désérialiser la réponse comme un tableau (la réponse serait [...] ) au lieu d'un seul objet (la réponse, comme indiqué, est {...} ). Changez votre code en :

var model = JsonConvert.DeserializeObject<NewsModel.RootObject>(data);

0voto

Essayez ce code.

using System.Net;

string requestUrl = String.Format("http://content.guardianapis.com/search?q=putin&api-key=6392a258-3c53-4e76-87ec-e9092356fa74");
string json = new WebClient().DownloadString(requestUrl);

var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string, dynamic>>(json.ToString());
object result = dict["results"];

foreach (object items in result as System.Collections.ArrayList)
{
    Dictionary<string, object> item = (Dictionary<string, object>)items;
    string type = item["type"];
    string sectionId = item["sectionId"];
    ...
    ...
    ...
    //or
    //foreach(object item in items) { }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X