napaka pri razčlenjevanju json napaka sintakse nepričakovan konec vnosa

Dobil sem naslednji del kode

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

Opazite, da sem vrednost podatkov kodiral na trdo. Podatki se v podatkovno zbirko prenesejo v redu. Vendar pa se vedno znova pojavi napaka "parsing error syntax error unexpected end of input". Prepričan sem, da so moji podatki v pravilni sintaksi JSON. Ko sem preveril z na omrežju Chrome inšpektorja saveProduct zahtevo je pokazala, da so podatki pravilni.

{ "Name": "AA" }

Na to zahtevo POST ni bilo odgovora. Zato ne vem, od kod je prišla napaka pri razčlenjevanju. Poskusil sem z brskalnikom FireFox. zgodilo se je enako.

Ali lahko kdo pove, kaj je narobe?

Hvala,

P.S. Tukaj je koda krmilnika

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();
            }
        }
    }
}
Rešitev

Ne morem z gotovostjo trditi, v čem je težava. Morda gre za kakšen slab znak, morda za presledke, ki ste jih pustili na začetku in na koncu, nimam pojma.

Vsekakor ne bi smeli trdno kodirati JSON v obliki nizov, kot ste to storili. Namesto tega je pravilen način pošiljanja podatkov JSON strežniku uporaba serializatorja JSON:

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

Zdaj v strežniku poskrbite tudi, da imate ustrezen model pogleda, ki pričakuje, da bo prejel ta vnos:

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

in ustrezno akcijo:

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

Zdaj je tu še ena stvar. Navedli ste dataType: 'json'. To pomeni, da pričakujete, da bo strežnik vrnil rezultat JSON. Akcija kontrolerja mora vrniti JSON. Če vaša akcija kontrolerja vrne pogled, bi to lahko pojasnilo napako, ki ste jo dobili. To se zgodi, ko jQuery poskuša razčleniti odgovor strežnika:

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

Kot rečeno, v večini primerov običajno ni treba nastaviti lastnosti dataType, ko izvajate zahtevo AJAX za akcijo kontrolerja ASP.NET MVC. Razlog za to je v tem, da bo ogrodje ob vračilu določenega rezultata ActionResult (na primer rezultata ViewResult ali rezultata JsonResult) samodejno nastavilo pravilno glavo HTTP odgovora Content-Type. jQuery bo nato to glavo uporabil za razčlenitev odgovora in jo podal kot parameter že razčlenjenemu povratnemu sporočilu o uspehu.

Domnevam, da je težava, ki jo imate, v tem, da strežnik ni vrnil veljavnega JSON. Vrnil je kakšen ViewResult ali PartialViewResult ali pa ste v akciji kontrolerja poskušali ročno izdelati pokvarjen JSON (česar seveda nikoli ne bi smeli početi, temveč namesto tega uporabiti JsonResult).

Opazil sem še eno stvar:

async: false,

Prosimo, izogibajte se nastavljanju tega atributa na false. Če ta atribut nastavite na false, zamrznete brskalnik odjemalca med celotnim izvajanjem zahteve. V tem primeru lahko izvedete običajno zahtevo. Če želite uporabljati AJAX, začnite razmišljati v smislu asinhronih dogodkov in povratnih klicev.

Komentarji (10)

Uporabljal sem zahtevo Node http in poslušal dogodek data. Ta dogodek le začasno prenese podatke v medpomnilnik, zato celoten JSON ni na voljo. Če želite to popraviti, je treba vsak dogodek data dodati v spremenljivko. Morda bo to komu pomagalo (http://nodejs.org/api/http.html).

Komentarji (0)

Zame je bilo vprašanje posledica enojnih narekovajev za par ime/vrednost... data: "{'Name':'AA'}"

Ko sem to spremenil v dvojne narekovaje za par ime/vrednost, je delovalo dobro... data: '{"Ime":"AA"}' ali takole... data: "{\"Ime\":\"AA\"}"

Komentarji (1)