json parsing error syntax error unerwartetes Ende der Eingabe

Ich habe folgendes Codestück erhalten

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

Beachten Sie, dass ich den Datenwert hart kodiert habe. Die Daten werden problemlos in die Datenbank übertragen. Allerdings erhalte ich immer wieder die Fehlermeldung "parsing error syntax error unexpected end of input". Ich bin sicher, dass meine Daten in der korrekten JSON-Syntax vorliegen. Als ich mit dem Inspektor von Chrome Network die saveProduct-Anforderung überprüfte, zeigte sich, dass die Daten korrekt sind.

{ "Name": "AA" }

Auf diese POST-Anfrage gab es keine Antwort. Ich bin also ratlos, woher der Parse-Fehler kam. Ich habe versucht, den FireFox-Browser zu verwenden, und dasselbe ist passiert.

Kann mir jemand einen Tipp geben, was falsch ist?

Danke!

P.S.. Hier ist der Code des Controllers

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ösung

Ich kann nicht mit Sicherheit sagen, was das Problem ist. Könnte ein schlechtes Zeichen sein, könnte die Leerzeichen sein, die Sie am Anfang und am Ende gelassen haben, keine Ahnung.

Wie auch immer, sollten Sie nicht hardcode Ihre JSON als Zeichenfolgen, wie Sie getan haben. Stattdessen ist der richtige Weg, um JSON-Daten an den Server zu senden, um eine JSON serializer verwenden:

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

Stellen Sie nun auf dem Server sicher, dass Sie das richtige Ansichtsmodell haben, das diese Eingabe erwartet:

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

und die entsprechende Aktion:

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

Nun gibt es noch eine weitere Sache. Sie haben dataType: 'json' angegeben. Das bedeutet, dass Sie erwarten, dass der Server ein JSON-Ergebnis zurückgibt. Die Controller-Aktion muss JSON zurückgeben. Wenn Ihre Controller-Aktion eine Ansicht zurückgibt, könnte dies den Fehler erklären, den Sie erhalten. Er tritt auf, wenn jQuery versucht, die Antwort des Servers zu parsen:

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

In den meisten Fällen müssen Sie die Eigenschaft dataType nicht setzen, wenn Sie eine AJAX-Anfrage an eine ASP.NET MVC-Controller-Aktion stellen. Der Grund dafür ist, dass, wenn Sie ein bestimmtes ActionResult zurückgeben (z.B. ein ViewResult oder ein JsonResult), das Framework automatisch den korrekten Content-Type Response HTTP Header setzt. jQuery verwendet dann diesen Header, um die Antwort zu parsen und sie als Parameter an den bereits geparsten Success Callback zu übergeben.

Ich vermute, dass das Problem, das Sie hier haben, darin besteht, dass Ihr Server kein gültiges JSON zurückgegeben hat. Entweder hat er ein ViewResult oder ein PartialViewResult zurückgegeben, oder Sie haben versucht, in Ihrer Controller-Aktion manuell gebrochenes JSON zu erzeugen (was Sie natürlich niemals tun sollten, sondern stattdessen das JsonResult verwenden).

Eine weitere Sache, die ich gerade bemerkt:

async: false,

Bitte vermeiden Sie es, dieses Attribut auf false zu setzen. Wenn Sie dieses Attribut auf false setzen, friert der Client-Browser während der gesamten Ausführung der Anfrage ein. In diesem Fall können Sie einfach eine normale Anfrage stellen. Wenn Sie AJAX verwenden wollen, sollten Sie an asynchrone Ereignisse und Rückrufe denken.

Kommentare (10)

Ich habe eine Node-"http"-Anfrage verwendet und auf das Ereignis "data" gewartet. Dieses Ereignis legt die Daten nur vorübergehend in einem Puffer ab, so dass kein vollständiges JSON verfügbar ist. Um das zu beheben, muss jedes data-Ereignis an eine Variable angehängt werden. Das könnte jemandem helfen (http://nodejs.org/api/http.html).

Kommentare (0)

Bei mir lag das Problem an den einfachen Anführungszeichen für das Name/Wert-Paar... data: "{'Name':'AA'}"

Nachdem ich es auf doppelte Anführungszeichen für das Name/Wert-Paar geändert habe, funktioniert es gut... Daten: '{"Name":"AA"}' oder wie folgt... data: "{"Name\":\"AA\"}"

Kommentare (1)