Mai mult
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();
}
}
}
}
52
3
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:
Acum, pe server, asigurați-vă, de asemenea, că aveți modelul de vizualizare corespunzător care se așteaptă să primească această intrare:
și acțiunea corespunzătoare:
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: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 anumitActionResult
(cum ar fi unViewResult
sau unJsonResult
), framework-ul va seta automat antetul HTTP de răspunsContent-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:
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.Am folosit o cerere
http
Node și am ascultat evenimentuldata
. Acest eveniment plasează datele doar temporar într-un buffer, astfel că nu este disponibil un JSON complet. Pentru a remedia problema, fiecare evenimentdata
trebuie adăugat la o variabilă. Ar putea ajuta pe cineva (http://nodejs.org/api/http.html).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"}"