it-swarm.com.de

json Syntaxfehler beim Syntaxanalysefehler unerwartetes Ende der Eingabe

Ich habe den folgenden Code bekommen

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 codiert habe. Die Daten werden in die Datenbank verschoben. Ich erhalte jedoch immer die Fehlermeldung "Fehler Syntaxfehler unerwartetes Ende der Eingabe". Ich bin sicher, dass meine Daten in korrekter JSON-Syntax sind. Bei der Überprüfung von in Network of Chrome-Inspector zeigte die saveProduct-Anforderung, dass die Daten korrekt sind. 

{ "Name": "AA" }

Diese POST - Anfrage hatte keine Antwort. Ich bin also ahnungslos, woher der Parsenfehler kam. Ich habe versucht, den Firefox-Browser zu verwenden. das Gleiche ist passiert.

Kann jemand eine Idee geben, was falsch ist?

Vielen Dank, 

P.S . Hier ist der Controller-Code

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

Kann nicht sicher sagen, was das Problem ist. Könnte ein schlechter Charakter sein, könnten die Leerzeichen, die Sie am Anfang und am Ende hinterlassen haben, keine Ahnung haben.

Wie auch immer, Sie sollten Ihren JSON nicht als Strings hartcodieren. Stattdessen können Sie JSON-Daten an den Server senden, indem Sie einen JSON-Serialisierer verwenden:

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

Stellen Sie jetzt auf dem Server sicher, dass Sie über das richtige Ansichtsmodell verfügen, das diese Eingabe erwartet:

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

und die entsprechende Aktion:

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

Jetzt gibt es noch eine Sache. Sie haben dataType: 'json' angegeben. Dies 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, kann dies den Fehler erklären, den Sie erhalten. JQuery versucht, die Antwort vom Server zu analysieren:

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

Das heißt, in den meisten Fällen müssen Sie normalerweise nicht die dataType -Eigenschaft festlegen, wenn Sie die Anforderung AJAX an eine ASP.NET-MVC-Controller-Aktion senden. Der Grund dafür ist, dass das Framework automatisch den korrekten Content-Type-Antwort-HTTP-Header setzt, wenn Sie ein bestimmtes ActionResult (z. B. ViewResult oder JsonResult) zurückgeben. jQuery verwendet dann diesen Header, um die Antwort zu parsen und als Parameter an den bereits geparsten Erfolgsrückruf zu übergeben.

Ich vermute, dass das Problem, das Sie hier haben, darin besteht, dass Ihr Server keine gültigen JSON-Werte zurückgegeben hat. Entweder wurde etwas ViewResult oder ein PartialViewResult zurückgegeben, oder Sie haben versucht, in Ihrer Controller-Aktion manuell ein defektes JSON zu erzeugen (was Sie offensichtlich niemals tun sollten, stattdessen JsonResult zu verwenden).

Noch etwas, was mir gerade aufgefallen ist:

async: false,

Vermeiden Sie es, dieses Attribut auf false zu setzen. Wenn Sie dieses Attribut auf false setzen, frieren Sie den Client-Browser während der gesamten Ausführung der Anforderung ein. In diesem Fall können Sie einfach eine normale Anfrage stellen. Wenn Sie AJAX verwenden möchten, denken Sie an asynchrone Ereignisse und Rückrufe.

66
Darin Dimitrov

Ich habe eine Node http-Anforderung verwendet und auf das data-Ereignis gewartet. Durch dieses Ereignis werden die Daten nur vorübergehend in einem Puffer gespeichert, sodass keine vollständige JSON verfügbar ist. Zur Behebung muss jedes data-Ereignis an eine Variable angehängt werden. Könnte jemandem helfen ( http://nodejs.org/api/http.html ).

4
Ben

Für mich lag das Problem in einfachen Anführungszeichen für das Name/Wert-Paar ... Data: "{'Name': 'AA'}"

Sobald ich es in doppelte Anführungszeichen für das Name/Wert-Paar geändert habe, funktioniert es einwandfrei ... Data: '{"Name": "AA"}' Oder so ... Data: " {\ "Name \":\"AA \"} "

1
Vish

Verwenden Sie einfache Anführungszeichen,

data: '{"Name":"AA"}'

Unerwartetes Ende der Eingabe bedeutet, dass der Parser vorzeitig beendet wurde. Zum Beispiel könnte es "abcd...wxyz" Erwarten, sieht aber nur "abcd...wxy.

Dies kann irgendwo ein Tippfehler Fehler sein, oder es kann ein Problem sein, wenn Codierungen über verschiedene Teile der Anwendung hinweg gemischt werden.

Ein Beispiel: Stellen Sie sich vor, Sie empfangen Daten von einer nativen App mit chrome.runtime.sendNativeMessage:

chrome.runtime.sendNativeMessage('appname', {toJSON:()=>{return msg}}, (data)=>{
    console.log(data);
});

Nun , bevor Ihr Rückruf aufgerufen wird, würde der Browser versuchen, die Nachricht mit JSON.parse Zu analysieren, was Ihnen "unerwartetes Ende der Eingabe" geben kann. Fehler, wenn angegebene Bytelänge nicht mit den Daten übereinstimmt.

0
Pacerier

Vielleicht wird es nützlich sein.

Der Name des Methodenparameters sollte mit JSON identisch sein

Es wird gut funktionieren

c #

public ActionResult GetMTypes(int id)

JS

 var params = { id: modelId  };
                 var url = '@Url.Action("GetMTypes", "MaintenanceTypes")';
                 $.ajax({
                     type: "POST",
                     url: url,
                     contentType: "application/json; charset=utf-8",
                     dataType: "json",
                     data: JSON.stringify(params),

Es funktioniert NICHT gut

c #

public ActionResult GetMTypes(int modelId)

JS

 var params = { id: modelId  };
                 var url = '@Url.Action("GetMTypes", "MaintenanceTypes")';
                 $.ajax({
                     type: "POST",
                     url: url,
                     contentType: "application/json; charset=utf-8",
                     dataType: "json",
                     data: JSON.stringify(params),

Ich habe das gemacht und dieses Problem gelöst.

var data = JSON.parse (Buffer.concat (arr) .toString ());

PS: In Knoten JS