eroare de analiză json eroare de sintaxă eroare de sintaxă sfârșit neașteptat al datelor de intrare

Am obținut următoarea bucată de cod

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

Observați că am codificat în mod dur valoarea datelor. Datele sunt introduse în baza de date fără probleme. Cu toate acestea, continui să primesc eroarea "parsing error syntax error unexpected end of input". Sunt sigur că datele mele sunt în sintaxa JSON corectă. Când am verificat cu pe Rețeaua de inspector Chrome cererea saveProduct a arătat că datele sunt corecte.

{ "Name": "AA" }

Această solicitare POST nu a avut răspuns. Așa că nu știu de unde provine eroarea de parse. Am încercat să folosesc browserul FireFox. același lucru s-a întâmplat.

Poate cineva să ne dea o idee despre ce este în neregulă?

Mulțumesc,

P.S. Iată codul controlerului

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();
            }
        }
    }
}
Soluția

Nu pot spune cu siguranță care este problema. Ar putea fi vreun caracter greșit, ar putea fi spațiile pe care le-ați lăsat la început și la sfârșit, habar n-am.

Oricum, nu ar trebui să codificați în mod greșit JSON-ul ca șiruri de caractere, așa cum ați făcut. În schimb, modul corect de a trimite date JSON către server este să folosești un serializator JSON:

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

Acum, pe server, asigurați-vă, de asemenea, că aveți modelul de vizualizare corespunzător care se așteaptă să primească această intrare:

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

și acțiunea corespunzătoare:

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

Acum mai este un lucru. Ați specificat dataType: 'json'. Acest lucru înseamnă că vă așteptați ca serverul să returneze un rezultat JSON. Acțiunea controlerului trebuie să returneze JSON. Dacă acțiunea controlerului returnează o vizualizare, acest lucru ar putea explica eroarea pe care o primiți. Este atunci când jQuery încearcă să analizeze răspunsul de la server:

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

Acestea fiind spuse, în cele mai multe cazuri, de obicei, nu este nevoie să setați proprietatea dataType atunci când faceți o cerere AJAX către o acțiune de controler ASP.NET MVC. Motivul este că atunci când returnezi un anumit ActionResult (cum ar fi un ViewResult sau un JsonResult), framework-ul va seta automat antetul HTTP de răspuns Content-Type corect. jQuery va folosi apoi acest antet pentru a analiza răspunsul și îl va introduce ca parametru în callback-ul de succes deja analizat.

Bănuiesc că problema pe care o aveți aici este că serverul dvs. nu a returnat JSON valid. Fie a returnat un ViewResult sau un PartialViewResult, fie ați încercat să creați manual un JSON stricat în acțiunea controlerului dumneavoastră (ceea ce, evident, nu ar trebui să faceți niciodată, ci să folosiți JsonResult în schimb).

Încă un lucru pe care tocmai l-am observat:

async: false,

Vă rugăm să evitați să setați acest atribut la false. Dacă setați acest atribut la false, înghețați browserul clientului pe durata întregii execuții a cererii. În acest caz, puteți face o cerere normală. Dacă doriți să utilizați AJAX, începeți să vă gândiți în termeni de evenimente asincrone și callback-uri.

Comentarii (10)

Am folosit o cerere http Node și am ascultat evenimentul data. Acest eveniment plasează datele doar temporar într-un buffer, astfel că nu este disponibil un JSON complet. Pentru a remedia problema, fiecare eveniment data trebuie adăugat la o variabilă. Ar putea ajuta pe cineva (http://nodejs.org/api/http.html).

Comentarii (0)

Pentru mine, problema a fost din cauza ghilimelelor simple pentru perechea nume/valoare... data: "{'Name':'AA'}"

După ce am schimbat-o în ghilimele duble pentru perechea nume/valoare, funcționează bine... data: '{"Name":"AA"}' sau așa... data: "{\"Nume":\"AA"}"

Comentarii (1)