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

jQuery Discussion :

Error : unexpected token { in JSON [AJAX]


Sujet :

jQuery

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 31
    Points : 27
    Points
    27
    Par défaut Error : unexpected token { in JSON
    Bonjour,
    Je n'arrive pas à me sortir d'un soucis de retour AJAX en JSON.
    Voilà mon problème :
    J'ai développé plusieurs webmethod en .NET pour récupérer des données d'une base SQLServer. Toutes ces webmethod fonctionnent correctement et le retour en JSON est correct.
    J' ai par exemple la webmethod suivante :
    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
    [WebMethod]
            public void GetDiagnostiqueurs()
            {
                string cs = ConfigurationManager.ConnectionStrings["EES.PortailParticipatif.BMO.Properties.Settings.ConnectionString"].ConnectionString;
                List<Diagnostiqueur> diagnostiqueurs = new List<Diagnostiqueur>();
                using (SqlConnection con = new SqlConnection(cs))
                {
                    SqlCommand cmd = new SqlCommand("GetDiagnostiqueursTinergie", con);
                    cmd.CommandType = CommandType.StoredProcedure;
                    con.Open();
                    SqlDataReader rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {
                        Diagnostiqueur d = new Diagnostiqueur();
                        d.u_id = Convert.ToInt32(rdr["u_id"]);
                        d.u_societe = rdr["u_societe"].ToString();
                        d.u_nom = rdr["u_nom"].ToString() + " " + rdr["u_prenom"].ToString();
                        d.u_email = rdr["u_email"].ToString();
                        d.u_adresse = rdr["u_adresse"].ToString() + " " + rdr["u_adresse2"].ToString();
                        d.u_ville = rdr["u_ville"].ToString();
                        d.u_telephone = rdr["u_telephone"].ToString();
                        d.u_dateCreation = rdr["u_dateCreation"].ToString();
                        d.FinAbonnement = rdr["FinAbonnement"].ToString();
                        d.u_dateDerniereConnexion = rdr["u_DerniereConnexion"].ToString();
                        d.u_DureeAbonnement = rdr["u_DureeAbonnement"].ToString();
                        d.u_actif = rdr["u_actif"].ToString();
                        d.DiagnosticsRealises = rdr["DiagnosticsRealises"].ToString();
                        d.action = "";
                        diagnostiqueurs.Add(d);
                    }
                    con.Close();
                }
                JavaScriptSerializer js = new JavaScriptSerializer();
                Context.Response.Write(js.Serialize(diagnostiqueurs));
     
            }
    et en Ajax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $(document).ready(function() {
                $.ajax({
                    url: '/WebServices/Diagnostiqueurs.asmx/GetDiagnostiqueurs',
                    method: 'post',
                    dataType: 'json',
                    success: function (data) {
                        alert("succes");
                    },
                    error: function (req) {
                        alert("erreur : " + req.responseText);
                    }
                });
            });
    ...et ça fonctionne correctement.

    Par contre, j'ai une webmethod avec un passage de paramètre. au niveau .NET, le retour semble correct.
    Le code .NET :
    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
    [WebMethod(EnableSession = true)]
            public void GetEntreprises(string travaux)
            {
                string cs = ConfigurationManager.ConnectionStrings["EES.PortailParticipatif.BMO.Properties.Settings.ConnectionString"].ConnectionString;
                List<Entreprise> entreprises = new List<Entreprise>();
                using (SqlConnection con = new SqlConnection(cs))
                {
                    SqlCommand cmd;
                    cmd = new SqlCommand("GetEntreprisesTravauxTinergie", con);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@idTravaux", SqlDbType.Int).Value = Convert.ToInt32(travaux);
                    con.Open();
                    cmd.ExecuteNonQuery();
                    SqlDataReader rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {
                        Entreprise e = new Entreprise();
                        e.u_id = Convert.ToInt32(rdr["u_id"]);
                        e.u_societe = rdr["u_societe"].ToString();
                        e.u_typeSociete = rdr["u_typeSociete"].ToString();
                        e.u_statutSociete = rdr["u_statutSociete"].ToString();
                        e.u_nom = rdr["u_nom"].ToString() + " " + rdr["u_prenom"].ToString();
                        e.u_email = rdr["u_email"].ToString();
                        e.u_adresse = rdr["u_adresse"].ToString() + " " + rdr["u_adresse2"].ToString();
                        e.u_ville = rdr["u_ville"].ToString();
                        e.u_telephone = rdr["u_telephone"].ToString();
                        e.u_dateCreation = rdr["u_dateCreation"].ToString();
                        e.u_dateActivation = rdr["u_dateActivation"].ToString();
                        e.FinAbonnement = rdr["FinAbonnement"].ToString();
                        e.u_dateDerniereConnexion = rdr["u_DerniereConnexion"].ToString();
                        e.u_DureeAbonnement = rdr["u_DureeAbonnement"].ToString();
                        e.u_actif = rdr["u_actif"].ToString();
                        e.action = "";
                        entreprises.Add(e);
                    }
                    con.Close();
                }
                JavaScriptSerializer js = new JavaScriptSerializer();
                Context.Response.Write(js.Serialize(entreprises));
     
            }
    La réponse retournée à ce niveau semble correcte.
    La voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"u_id":565,"u_societe":"x","u_typeSociete":"pme","u_statutSociete":"SARL","u_nom":"untel","u_email":"untel@x.fr","u_adresse":"2 rue untel","u_ville":"paris","u_telephone":"00 00 00 00 00","u_dateCreation":"15/01/2014","FinAbonnement":"31/12/2017","u_DureeAbonnement":"12 mois","u_dateActivation":"01/01/2016","u_dateDerniereConnexion":"28/05/2017","u_actif":"Oui","action":""}]
    Pour mon ajax, j'ai mis :
    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
            $(document).ready(function() {
                $.ajax({
                    type:'POST',
                    url: '/WebServices/Entreprises.asmx/GetEntreprises',
                    contentType: "application/json; charset=utf-8",
                    data: '{travaux: "2" }',
                    dataType: 'json',
                    success: function (data) {
                        alert("success");
                    },
                    error: function (xhr, ajaxOptions, thrownError) {
                        alert(xhr.status + " : " + thrownError + " || " + xhr.responseText);
                    }
                });
            });
    L'ajax me retourne une erreur "200 : SyntaxError: Unexpected token { in JSON at position...".
    En regardant la réponse xhr, je vois que celle-ci comprend bien ce que me retourne ma webmethod, mais ajoute {"d":null} à la fin.
    J'ai donc ceci en réponse xhr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"u_id":565,"u_societe":"x","u_typeSociete":"pme","u_statutSociete":"SARL","u_nom":"untel","u_email":"untel@x.fr","u_adresse":"2 rue untel","u_ville":"paris","u_telephone":"00 00 00 00 00","u_dateCreation":"15/01/2014","FinAbonnement":"31/12/2017","u_DureeAbonnement":"12 mois","u_dateActivation":"01/01/2016","u_dateDerniereConnexion":"28/05/2017","u_actif":"Oui","action":""}]{"d":null}
    En gras ce qui me pose problème.
    Pouvez-vous m'aider à comprendre pourquoi j'ai cette {} en plus en fin de réponse ?
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 451
    Points : 4 600
    Points
    4 600
    Par défaut
    du json doit etre formate ainsi : { ... }
    donc ta data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     [{"u_id":565,"u_societe"... }]
    est faux.
    il faudrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {[{"u_id":565,"u_societe"...}]}
    tu ne semble qu'avoir 1 element a ton tableau donc tu peux directement ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"u_id":565,"u_societe"...}
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Merci Doksuri pour ton aide.
    Je ne vois pas comment je pourrai obliger à mettre les accolades.
    Dans le premier exemple que j'ai donné et qui fonctionne, le webservice ASP me renvoie des données entre [] et le reste fonctionne.
    Mais pas pour le second exemple, et mon webservice ASP est fait de la même façon.

    Je pense que ça viendrait plutôt du fait que je passe un paramètre et que je définis un contentType
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contentType: "application/json; charset=utf-8"
    mais je ne vois pas comment remédier à mon problème.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Résolu.
    C'est bien le ContentType qui posait problème.
    Pour information, ce qu'il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $(document).ready(function() {
                var dataParam = { 'travaux': $(".TypeTravaux option:selected").val() };
                $.ajax({
                    type:'POST',
                    url: '/WebServices/Entreprises.asmx/GetEntreprises',
                    data: dataParam,
                    dataType: 'json',
                    success: function (data) {
                        alert("succes");
                    },
                    error: function (req) {
                        alert("erreur : " + req.responseText);
                    }
                });

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Eval:Uncaught suntax error:Unexpected token illegal
    Par jules_diedhiou dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 17/04/2012, 10h02
  2. erreur : syntax error near unexpected token
    Par lapinou8430 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 28/04/2009, 00h30
  3. Réponses: 6
    Dernier message: 16/10/2008, 10h44
  4. Réponses: 5
    Dernier message: 01/02/2008, 15h59
  5. [sh] syntax error near unexpected token `}'
    Par vercin dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/09/2007, 11h33

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