erreur d'analyse json erreur de syntaxe fin inattendue de l'entrée

J'ai obtenu le morceau de code suivant

function pushJsonData(productName) {
    $.ajax({
        url: "/knockout/SaveProduct",
        type: "POST",
        contentType: "application/json",
        dataType: "json",
        data: " { \"Name\" : \"AA\" } ",
        async: false,
        success: function () {
            loadJsonData();   
        },
        error: function (jqXHR, textStatus, errorThrown) {
          alert(textStatus + " in pushJsonData: " + errorThrown + " " + jqXHR);
        }
    });
}

Remarquez que j'ai codé en dur la valeur des données. Les données sont bien poussées dans la base de données. Cependant, je continue à obtenir l'erreur "parsing error syntax error unexpected end of input&quot ;. Je suis sûr que mes données sont dans la syntaxe JSON correcte. Lorsque j'ai vérifié avec l'inspecteur Network of Chrome, la requête saveProduct montre que les données sont correctes.

{ "Name": "AA" }

Cette requête POST n'a pas eu de réponse. Je ne sais donc pas d'où vient l'erreur d'analyse. J'ai essayé d'utiliser le navigateur FireFox. La même chose s'est produite.

Quelqu'un peut-il me donner une idée de ce qui ne va pas ?

Merci,

P.S. Voici le code du contrôleur

namespace MvcApplJSON.Controllers
{
    public class KnockoutController : Controller
    {
        //
        // GET: /Knockout/

        public ActionResult Index()
        {
            return View();
        }

        [HttpGet]
        public JsonResult GetProductList()
        {
            var model = new List<Product>();
            try
            {
                using (var db = new KOEntities())
                {
                    var product = from p in db.Products orderby p.Name select p;
                    model = product.ToList();
                }
            }
            catch (Exception ex)
            { throw ex; }
            return Json(model, JsonRequestBehavior.AllowGet);
        }
        [HttpPost]
        public void SaveProduct (Product product)
        {
            using (var db = new KOEntities())
            {
                db.Products.Add(new Product { Name = product.Name, DateCreated = DateTime.Now });
                db.SaveChanges();
            }
        }
    }
}
Solution

Je ne peux pas dire avec certitude quel est le problème. Il peut s'agir d'un mauvais caractère, des espaces que vous avez laissés au début et à la fin, aucune idée.

Quoi qu'il en soit, vous ne devriez pas coder en dur votre JSON sous forme de chaînes de caractères comme vous l'avez fait. La bonne façon d'envoyer des données JSON au serveur est d'utiliser un sérialiseur JSON :

data: JSON.stringify({ name : "AA" }),

Maintenant, sur le serveur, assurez-vous que vous avez le bon modèle de vue qui attend de recevoir cette entrée :

public class UserViewModel
{
    public string Name { get; set; }
}

et l'action correspondante :

[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
    ...
}

Il y a encore une chose. Vous avez spécifié dataType : 'json'. Cela signifie que vous vous attendez à ce que le serveur renvoie un résultat JSON. L'action du contrôleur doit renvoyer JSON. Si votre action de contrôleur renvoie une vue, cela peut expliquer l'erreur que vous obtenez. C&#8217est lorsque jQuery tente d&#8217analyser la réponse du serveur :

[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
    ...
    return Json(new { Foo = "bar" });
}

Ceci étant dit, dans la plupart des cas, il n'est pas nécessaire de définir la propriété dataType lors d'une requête AJAX vers une action de contrôleur ASP.NET MVC. La raison en est que lorsque vous renvoyez un ActionResult spécifique (tel qu'un ViewResult ou un JsonResult), le framework définira automatiquement le bon en-tête HTTP de réponse Content-Type. jQuery utilisera ensuite cet en-tête pour analyser la réponse et la transmettre comme paramètre au callback de succès déjà analysé.

Je soupçonne que le problème que vous rencontrez ici est que votre serveur n'a pas renvoyé de JSON valide. Soit il a renvoyé un ViewResult ou un PartialViewResult, soit vous avez essayé de créer manuellement un JSON erroné dans votre action de contrôleur (ce que vous ne devriez évidemment jamais faire, mais plutôt utiliser le JsonResult).

Une dernière chose que je viens de remarquer :

async: false,

S'il vous plaît, évitez de mettre cet attribut à false. Si vous mettez cet attribut à false, vous bloquez le navigateur du client pendant toute l'exécution de la demande. Dans ce cas, vous pouvez simplement faire une demande normale. Si vous voulez utiliser AJAX, commencez à penser en termes d'événements asynchrones et de callbacks.

Commentaires (10)

J'ai utilisé une requête http de Node et écouté l'événement data. Cet événement met seulement les données dans un tampon temporairement, et donc un JSON complet n'est pas disponible. Pour résoudre ce problème, chaque événement data doit être ajouté à une variable. Cela pourrait aider quelqu'un (http://nodejs.org/api/http.html).

Commentaires (0)

Pour moi, le problème était dû aux guillemets simples pour la paire nom/valeur... data: "{'Name':'AA'}"

Une fois que j'ai remplacé les guillemets doubles pour la paire nom/valeur, tout fonctionne bien... data : '{"Name":"AA"}&#39 ; ou comme ceci... data : '{"Name":"AA"}&quot ;

Commentaires (1)