IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Désérialisation JSON depuis API


Sujet :

ASP.NET MVC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 34
    Points : 25
    Points
    25
    Par défaut Désérialisation JSON depuis API
    Bonjour à tous,

    Je revient vers vous, car après avoir tout essayé je n'arrive pas à déserializer le json suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    {
        "totalcount": 2,
        "count": 2,
        "sort": "1",
        "order": "ASC",
        "data": [
            {
                "1": "S011908",
                "80": "Root entity",
                "31": "Hors-service > En attente réinitialisation",
                "70": "TARTUF",
                "id": 1333,
                "itemtype": "Computer"
            },
            {
                "1": "S01B2101",
                "80": "Root entity",
                "31": "Fonctionnel > Utilisé",
                "70": "FILOU",
                "id": 1360,
                "itemtype": "Computer"
            }
        ],
        "content-range": "0-1/2"
    }
    Il s'agit d'un json obtenu depuis l' API de GLPI, pour la connexion pas de problème, j'ai mes accès j'arrive à récupérer la liste dans mon _repository

    CONTROLLERS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    using Portail_DIN.Models;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Text;
    using System.Web;
    using System.Web.Mvc;
    using Newtonsoft.Json;
     
    namespace Portail_DIN.Controllers
    {
        public class GLPIController : Controller
        {
            private readonly GLPIJSONRepository _repository;
            private WebClient client = new WebClient();
            private string session_token;
            public GLPIController()
            {
                client.UseDefaultCredentials = true;
                client.Headers.Add("App-Token", "test");
                client.Headers.Add("Authorization", "Basic test");
                string path = client.DownloadString("https://IP/glpi/apirest.php/initSession");
                session_token = path.Substring(18, path.LastIndexOf("\"") - 18); 
     
                client.Headers.Add("session-token", session_token);// "");
                client.Headers.Add(HttpRequestHeader.Accept, "application/json");
                client.Encoding = Encoding.UTF8;
                string json = client.DownloadString("https://IP/glpi/apirest.php/search/AllAssets/?is_deleted=0&as_map=0&criteria[0][link]=AND&criteria[0][field]=70&criteria[0][searchtype]=contains&criteria[0][value]=Normand");
                //View(json);
                _repository = new GLPIJSONRepository(json);
            }
     
     
            // GET: GLPI
            public ActionResult GLPI()
            {
                try
                {
                    List<Glpi> list = _repository.GetAllList().ToList();
                    return View(list);
                }
                catch
                {
                    return View(new List<Glpi>());
                }
            }
        }
    }
    Au niveau du model je pense avoir défini comme il le faut, le doute est au niveau du Datum !

    MODELS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    using System;
    using System.Collections.Generic;
     
    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;
     
    namespace Portail_DIN.Models
    {
        public partial class Glpi
        {
            [JsonProperty("totalcount")]
            public long Totalcount { get; set; }
     
            [JsonProperty("count")]
            public long Count { get; set; }
     
            [JsonProperty("sort")]
            public long Sort { get; set; }
     
            [JsonProperty("order")]
            public string Order { get; set; }
     
            [JsonProperty("data")]
            public Datum[] Data { get; set; }
     
            [JsonProperty("content-range")]
            public string ContentRange { get; set; }
        }
     
        public partial class Datum
        {
            [JsonProperty("1")]
            public string Nommachine { get; set; }
     
            [JsonProperty("31")]
            public string Statut { get; set; }
     
            [JsonProperty("70")]
            public string Utilisateur { get; set; }
     
            [JsonProperty("80")]
            public string Entite { get; set; }
     
            [JsonProperty("id")]
            public long Id { get; set; }
     
            [JsonProperty("itemtype")]
            public string Itemtype { get; set; }
        }
    }
    MODELS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using Newtonsoft.Json;
    using System.IO;
     
    namespace Portail_DIN.Models
    {
        /// <summary>
        /// permet de gérer les articles qui sont enregistrés dans un fichier JSON
        /// </summary>
        public class GLPIJSONRepository
        {
            /// <summary>
            /// Représente le chemin du fichier JSON
            /// </summary>
            private readonly string _savedFileGLPI;
     
            /// <summary>
            /// Construit le gestionnaire d'article à partir du nom d'un fichier JSON
            /// </summary>
            /// <param name="fileName">nom du fichier json</param>
            public GLPIJSONRepository(string fileName)
            {
                _savedFileGLPI = fileName;
            }
     
            /// <summary>
            /// Obtient une liste de tout les articles
            /// </summary>
            public IEnumerable<Glpi> GetAllList()
            {
                List<Glpi> list = JsonConvert.DeserializeObject<List<Glpi>>(_savedFileGLPI);
                return list;
            }
        }
    }
    Donc, comme je comprends, je n'arrive pas à deserializer mon json pour le mettre dans ma liste.

    J'obtiens le message suivant dans Visual Studio dans mon point d'arrêt.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		List<Glpi> list = _repository.GetAllList().ToList();
    error CS0305: L'utilisation du type générique 'List<T>' nécessite des arguments de type 1
    Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Portail_DIN.Models.Glpi]' 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 'totalcount', line 1, position 14.
    Merci d'avance pour vos lumières

  2. #2
    Membre confirmé Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 339
    Points : 458
    Points
    458
    Par défaut
    Bonjour,

    Plusieurs choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /// <summary>
            /// Construit le gestionnaire d'article à partir du nom d'un fichier JSON
            /// </summary>
            /// <param name="fileName">nom du fichier json</param>
            public GLPIJSONRepository(string fileName)
            {
                _savedFileGLPI = fileName;
            }
    Donc, le constructeur reçoit le chemin d'accès à un fichier.

    Pourtant, vous lui passez une string contenant le JSON obtenu depuis votre API :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string json = client.DownloadString("https://IP/glpi/apirest.php/search/AllAssets/?is_deleted=0&as_map=0&criteria[0][link]=AND&criteria[0][field]=70&criteria[0][searchtype]=contains&criteria[0][value]=Normand");
                //View(json);
                _repository = new GLPIJSONRepository(json);
    Documentation à mettre à jour, sinon pas clair du tout.


    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Glpi> list = JsonConvert.DeserializeObject<List<Glpi>>(_savedFileGLPI);
    Donc, vous lui demandez de désérialiser du JSON dans une List<T>. Soit. Encore faut il que le JSON représente une liste (un tableau quoi).
    En l'occurence, le JSON que vous nous montrez n'est absolument pas la représentation d'un tableau. Il s'agit de la représentation d'un objet.

    Ceci fonctionnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Glpi monObjetGlpi = JsonConvert.DeserializeObject<Glpi>(_savedFileGLPI);
    Ce qui pourrait fonctionner sans toucher à votre code serait de recevoir du JSON dans ce format là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    [
    	{
    		"totalcount": 2,
    		"count": 2,
    		"sort": "1",
    		"order": "ASC",
    		"data": [
    			{
    				"1": "S011908",
    				"80": "Root entity",
    				"31": "Hors-service > En attente réinitialisation",
    				"70": "TARTUF",
    				"id": 1333,
    				"itemtype": "Computer"
    			},
    			{
    				"1": "S01B2101",
    				"80": "Root entity",
    				"31": "Fonctionnel > Utilisé",
    				"70": "FILOU",
    				"id": 1360,
    				"itemtype": "Computer"
    			}
    		],
    		"content-range": "0-1/2"
    	},
    	{
    		"totalcount": 2,
    		"count": 2,
    		"sort": "1",
    		"order": "ASC",
    		"data": [
    			{
    				"1": "S011908",
    				"80": "Root entity",
    				"31": "Hors-service > En attente réinitialisation",
    				"70": "TARTUF",
    				"id": 1333,
    				"itemtype": "Computer"
    			},
    			{
    				"1": "S01B2101",
    				"80": "Root entity",
    				"31": "Fonctionnel > Utilisé",
    				"70": "FILOU",
    				"id": 1360,
    				"itemtype": "Computer"
    			}
    		],
    		"content-range": "0-1/2"
    	}
    ]
    TL;DR : Vous essayez de désérialiser du JSON représentant un objet simple vers un tableau. Soit vous corrigez votre code pour ne désérialiser qu'un objet simple, soit vous corrigez votre JSON pour recevoir la représentation d'un tableau.
    En gros, lire ce que dit le message :
    Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Portail_DIN.Models.Glpi]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly

Discussions similaires

  1. Récupéré JSON depuis une API
    Par quichaci dans le forum Android
    Réponses: 9
    Dernier message: 01/12/2014, 14h28
  2. Retourner un objet json depuis un $.get
    Par falatop dans le forum jQuery
    Réponses: 1
    Dernier message: 16/08/2010, 17h45
  3. [Web Service] envoyer du JSON depuis PHP
    Par enzostar dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 26/03/2010, 16h54
  4. Récupération message JSON depuis fichier JS distant sous IE
    Par JBViper dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/11/2009, 11h08
  5. Réponses: 2
    Dernier message: 26/03/2008, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo