json parsavimo klaida sintaksės klaida netikėta įvesties pabaiga

Gavau tokį kodo fragmentą

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

Atkreipkite dėmesį, kad duomenų vertę užkodavau kietai. Duomenys į duomenų bazę perkeliami gerai. Tačiau nuolat gaunu klaidą "parsing error syntax error unexpected end of input". Esu įsitikinęs, kad mano duomenys yra teisingos JSON sintaksės. Kai patikrinau su "Chrome" inspektoriaus tinkle "SaveProduct" užklausą, duomenys yra teisingi.

{ "Name": "AA" }

Į šią POST užklausą atsakymo nebuvo gauta. Taigi nežinau, iš kur atsirado parsavimo klaida. Bandžiau naudoti "FireFox" naršyklę. atsitiko tas pats.

Ar kas nors gali pateikti kokią nors idėją, kas yra negerai?

Ačiū,

P.S. Štai valdiklio kodas

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

Negaliu tvirtai pasakyti, kokia tai problema. Gali būti, kad tai koks nors blogas simbolis, gali būti, kad pradžioje ir pabaigoje palikti tarpai, neįsivaizduoju.

Bet kokiu atveju, neturėtumėte kietai koduoti savo JSON kaip eilutės, kaip jūs padarėte. Tinkamas būdas siųsti JSON duomenis į serverį - naudoti JSON serializatorių:

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

Dabar serveryje taip pat įsitikinkite, kad turite tinkamą peržiūros modelį, kuris tikisi gauti šią įvestį:

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

ir atitinkamą veiksmą:

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

Dabar yra dar vienas dalykas. Jūs nurodėte dataType: 'json'. Tai reiškia, kad tikitės, jog serveris grąžins JSON rezultatą. Valdiklio veiksmas turi grąžinti JSON. Jei jūsų valdiklio veiksmas grąžina vaizdą, tai gali paaiškinti klaidą, kurią gaunate. Taip yra tada, kai "jQuery" bando analizuoti atsakymą iš serverio:

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

Tai sakant, daugeliu atvejų dažniausiai nereikia nustatyti dataType savybės, kai atliekama AJAX užklausa ASP.NET MVC valdiklio veiksmui. Taip yra todėl, kad kai grąžinate tam tikrą konkretų ActionResult (pvz., ViewResult arba JsonResult), sistema automatiškai nustatys tinkamą Content-Type atsakymo HTTP antraštę. jQuery tada naudos šią antraštę atsakymui analizuoti ir pateiks jį kaip parametrą jau išanalizuotam sėkmės grįžtamajam ryšiui.

Įtariu, kad problema, su kuria susiduriate, yra ta, kad jūsų serveris negrąžino tinkamo JSON. Jis arba grąžino kokį nors ViewResult, arba PartialViewResult, arba bandėte rankiniu būdu sukurti sugadintą JSON savo valdiklio veiksme (ko, aišku, niekada neturėtumėte daryti, o vietoj to naudoti JsonResult).

Dar vienas dalykas, kurį ką tik pastebėjau:

async: false,

Venkite nustatyti šį atributą kaip false. Jei nustatysite šį atributą į false, kliento naršyklė užšals viso užklausos vykdymo metu. Tokiu atveju galite tiesiog atlikti įprastą užklausą. Jei norite naudoti AJAX, pradėkite galvoti apie asinchroninius įvykius ir grįžtamuosius skambučius.

Komentarai (10)

Naudojau mazgo http užklausą ir klausiausi data įvykio. Šis įvykis tik laikinai perkelia duomenis į buferį, todėl pilnas JSON nėra prieinamas. Norint ištaisyti, kiekvienas data įvykis turi būti pridedamas prie kintamojo. Gal kam nors padės (http://nodejs.org/api/http.html).

Komentarai (0)

Man problema kilo dėl viengubų kabučių vardo ir vertės poroje... data: "{'Name':'AA'}"

Kai pakeičiau į dvigubas kabutes vardo ir vertės porai, viskas veikia gerai... data: '{'{"Name":"AA"}' arba taip... data: "{\"Vardas\":\"AA\"}"

Komentarai (1)