json parsing error syntax error uventet slutt på input

Jeg fikk følgende 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);
        }
    });
}

Legg merke til at jeg hardkodet dataverdien. Dataene blir presset inn i databasen fint. Imidlertid får jeg stadig feilen "parsing error syntax error unexpected end of input". Jeg er sikker på at dataene mine er i riktig JSON-syntaks. Da jeg sjekket med Network of Chrome-inspektøren, viste saveProduct-forespørselen at dataene er riktige.

{ "Name": "AA" }

Denne POST-forespørselen hadde ikke svar. Så jeg har ingen anelse om hvor analysefeilen kom fra. Jeg prøvde å bruke FireFox-nettleseren. det samme skjedde.

Kan noen gi noen ide om hva som er galt?

På forhånd takk,

P.S. Her er koden til kontrolleren

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();
            }
        }
    }
}
Løsning

Jeg kan ikke si sikkert hva problemet er. Kan være noen dårlige tegn, kan være mellomrommene du har igjen i begynnelsen og på slutten, ingen anelse.

Uansett bør du ikke hardkode JSON som strenger som du har gjort. I stedet er den riktige måten å sende JSON-data til serveren å bruke en JSON-serializer:

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

Nå på serveren må du også sørge for at du har riktig visningsmodell som forventer å motta denne inngangen:

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

og den tilsvarende handlingen:

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

Nå er det en ting til. Du har spesifisert dataType: 'json'. Dette betyr at du forventer at serveren vil returnere et JSON-resultat. Kontrollerhandlingen må returnere JSON. Hvis kontrollerhandlingen din returnerer en visning, kan dette forklare feilen du får. Det er når jQuery forsøker å analysere svaret fra serveren:

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

Når det er sagt, i de fleste tilfeller trenger du vanligvis ikke å angi dataType -egenskapen når du gjør AJAX-forespørsel til en ASP.NET MVC-kontrollerhandling. Årsaken til dette er at når du returnerer noen spesifikke ActionResult (for eksempel en ViewResult eller en JsonResult), vil rammeverket automatisk angi riktig Content-Type svar HTTP-header. jQuery vil da bruke denne overskriften til å analysere svaret og mate det som parameter til suksess callback allerede analysert.

Jeg mistenker at problemet du har her er at serveren din ikke returnerte gyldig JSON. Det returnerte enten noen ViewResult eller en PartialViewResult, eller du prøvde å lage noen ødelagte JSON manuelt i kontrollerhandlingen din (som du åpenbart aldri burde gjøre, men bruke JsonResult i stedet).

En ting til som jeg nettopp la merke til:

async: false,

Vennligst unngå å sette dette attributtet til false. Hvis du setter dette attributtet til false, fryser du klientens nettleser under hele utførelsen av forespørselen. I dette tilfellet kan du bare sende en vanlig forespørsel. Hvis du vil bruke AJAX, bør du begynne å tenke på asynkrone hendelser og callbacks.

Kommentarer (10)

Jeg brukte en Node http-forespørsel og lyttet etter data-hendelsen. Denne hendelsen plasserer bare dataene midlertidig i en buffer, og en fullstendig JSON er derfor ikke tilgjengelig. For å fikse dette må hver data-hendelse legges til en variabel. Kan hjelpe noen (http://nodejs.org/api/http.html).

Kommentarer (0)

For meg skyldtes problemet enkle anførselstegn for paret navn/verdi ... data: "{'Name':'AA'}"

Når jeg endret det til doble anførselstegn for navn/verdi-paret, fungerer det fint ... data: '{"Navn":"AA"}' eller slik... data: "{\"Navn\":\"AA\"}"

Kommentarer (1)