errore di parsing json errore di sintassi inaspettato fine dell'input

Ho ottenuto il seguente pezzo di codice

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);
        }
    });
}

Notate che ho codificato il valore dei dati. I dati vengono spinti nel database senza problemi. Tuttavia, continuo a ricevere l'errore "parsing error syntax error unexpected end of input". Sono sicuro che i miei dati sono in sintassi JSON corretta. Quando ho controllato con su Network of Chrome inspector la richiesta saveProduct ha mostrato che i dati sono corretti.

{ "Name": "AA" }

Questa richiesta POST non ha avuto risposta. Quindi non so da dove venga l'errore di parsing. Ho provato a usare il browser FireFox. è successa la stessa cosa.

Qualcuno può dare qualche idea su cosa sia sbagliato?

Grazie,

P.S. Ecco il codice del controller

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();
            }
        }
    }
}
Soluzione

Non posso dire con certezza quale sia il problema. Potrebbe essere qualche cattivo carattere, potrebbero essere gli spazi che hai lasciato all'inizio e alla fine, non ne ho idea.

Comunque, non dovresti hardcodeare il tuo JSON come stringhe come hai fatto tu. Invece il modo corretto di inviare dati JSON al server è quello di utilizzare un serializzatore JSON:

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

Ora sul server assicurati anche di avere il corretto modello di vista che si aspetta di ricevere questo input:

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

e l'azione corrispondente:

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

Ora c'è un'altra cosa. Hai specificato dataType: 'json'. Questo significa che ti aspetti che il server restituisca un risultato JSON. L'azione del controller deve restituire JSON. Se la tua azione controller restituisce una vista questo potrebbe spiegare l'errore che stai ottenendo. È quando jQuery tenta di analizzare la risposta del server:

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

Detto questo, nella maggior parte dei casi, di solito non è necessario impostare la proprietà dataType quando si fa una richiesta AJAX a un'azione del controller ASP.NET MVC. La ragione è che quando si restituisce una specifica ActionResult (come un ViewResult o un JsonResult), il framework imposterà automaticamente il corretto header HTTP di risposta Content-Type. jQuery utilizzerà quindi questo header per analizzare la risposta e fornirla come parametro al callback di successo già analizzato.

Sospetto che il problema che stai avendo qui è che il tuo server non ha restituito JSON valido. O ha restituito un ViewResult o un PartialViewResult, o hai cercato di creare manualmente del JSON non valido nella tua azione di controllo (cosa che ovviamente non dovresti mai fare ma usare invece il JsonResult).

Un'altra cosa che ho appena notato:

async: false,

Per favore, evitate di impostare questo attributo su false. Se impostate questo attributo a false state congelando il browser client durante l'intera esecuzione della richiesta. In questo caso potresti semplicemente fare una richiesta normale. Se volete usare AJAX, iniziate a pensare in termini di eventi asincroni e callback.

Commentari (10)

Stavo usando una richiesta Node http e ascoltando l'evento data. Questo evento mette solo i dati in un buffer temporaneamente, e quindi un JSON completo non è disponibile. Per risolvere, ogni evento data deve essere aggiunto a una variabile. Potrebbe aiutare qualcuno (http://nodejs.org/api/http.html).

Commentari (0)

Per me il problema era dovuto alle virgolette singole per la coppia nome/valore... data: "{'Name':'AA'}"

Una volta che l'ho cambiato in virgolette doppie per la coppia nome/valore, funziona bene... dati: '{"Nome":"AA"}' o come questo... dati: "{"Nome":"AA"}"

Commentari (1)