JSON-parseerfout syntaxisfout onverwacht einde van invoer

Ik heb het volgende stukje code

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

Merk op dat ik de gegevenswaarde hard heb gecodeerd. De gegevens worden geduwd in de database boete. Ik krijg echter steeds de foutmelding

syntaxisfout bij parseerfout onverwacht einde van invoer

Ik weet zeker dat mijn gegevens de juiste JSON-syntaxis hebben. Toen ik het controleerde met op Network of Chrome-inspecteur, toonde het saveProduct-verzoek dat de gegevens correct zijn.

{ "Name": "AA" }

Dit POST-verzoek is niet beantwoord. Dus ik heb geen idee waar de parseerfout vandaan kwam. Ik heb geprobeerd de FireFox-browser te gebruiken. hetzelfde gebeurde.

Kan iemand een idee geven van wat er mis is?

Bedankt,

P.S.
Hier is de controllercode

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

Antwoord 1, autoriteit 100%

Ik kan niet met zekerheid zeggen wat het probleem is. Het kan een slecht karakter zijn, het kunnen de spaties zijn die je aan het begin en aan het einde nog hebt, geen idee.

Hoe dan ook, je moet je JSON niet hardcoderen als strings zoals je hebt gedaan. In plaats daarvan is de juiste manier om JSON-gegevens naar de server te sturen een JSON-serializer:

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

Zorg er nu ook voor dat u op de server het juiste weergavemodel hebt om deze invoer te ontvangen:

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

en de bijbehorende actie:

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

Nu is er nog iets. U heeft dataType: 'json' opgegeven. Dit betekent dat u verwacht dat de server een JSON-resultaat retourneert. De controlleractie moet JSON retourneren. Als uw controlleractie een weergave retourneert, kan dit de fout verklaren die u krijgt. Het is wanneer jQuery het antwoord van de server probeert te ontleden:

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

Dit gezegd zijnde, hoeft u in de meeste gevallen de eigenschap dataType niet in te stellen wanneer u een AJAX-verzoek doet voor een ASP.NET MVC-controlleractie. De reden hiervoor is dat wanneer u een specifiek ActionResult retourneert (zoals een ViewResult of een JsonResult), het framework automatisch de juiste Content-Type reactie HTTP-header. jQuery zal dan deze header gebruiken om het antwoord te ontleden en het als parameter te geven aan de reeds geparseerde succesvolle callback.

Ik vermoed dat het probleem dat u hier ondervindt, is dat uw server geen geldige JSON heeft geretourneerd. Het heeft ofwel een ViewResult of een PartialViewResult geretourneerd, of je hebt geprobeerd handmatig een kapotte JSON in je controlleractie te maken (wat je natuurlijk nooit zou moeten doen, maar in plaats daarvan de JsonResult moet gebruiken).

Nog iets dat me net is opgevallen:

async: false,

Alsjeblieft, stel dit kenmerk niet in op false. Als u dit kenmerk instelt op false, bevriest u de clientbrowser tijdens de gehele uitvoering van het verzoek. U kunt in dit geval gewoon een normaal verzoek indienen. Als je AJAX wilt gebruiken, denk dan in termen van asynchrone events en callbacks.


Antwoord 2, autoriteit 8%

Ik gebruikte een Node http-verzoek en luisterde naar de gebeurtenis data. Met deze gebeurtenis worden de gegevens alleen tijdelijk in een buffer geplaatst en is er dus geen volledige JSON beschikbaar. Om dit op te lossen, moet elke gebeurtenis data worden toegevoegd aan een variabele. Kan iemand helpen (http://nodejs.org/api/http.html).


Antwoord 3, autoriteit 4%

Geen lege Json retourneren

In mijn geval retourneerde ik een lege Json-reeks in het .Net Core Web API-project.

Dus ik heb mijn code gewijzigd

Van

 return Ok();

Naar

 return Ok("Done");

Het lijkt erop dat je een string of object moet teruggeven.

Hopelijk helpt dit.


Antwoord 4

Voor mij was het probleem te wijten aan enkele aanhalingstekens voor het naam/waarde-paar…
gegevens: “{‘Naam’:’AA’}”

Zodra ik het heb gewijzigd in dubbele aanhalingstekens voor het naam/waarde-paar, werkt het prima…
gegevens: ‘{“Naam”:”AA”}’
of zo…
gegevens: “{\”Naam\”:\”AA\”}”


Antwoord 5

Misschien is het nuttig.

De naam van de methodeparameter moet hetzelfde zijn als in JSON

Het zal goed werken

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),

Het zal NIET goed werken

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),

Antwoord 6

Onverwacht einde van invoer betekent dat de parser voortijdig is beëindigd. Het kan bijvoorbeeld "abcd...wxyz" verwachten, maar alleen "abcd...wxy zien.

Dit kan ergens een typfout zijn, of het kan een probleem zijn dat u krijgt wanneer coderingen in verschillende delen van de toepassing worden gemengd.

Eén voorbeeld: stel dat u gegevens ontvangt van een native app die chrome.runtime.sendNativeMessage gebruikt:

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

Nu voordat uw callback wordt aangeroepen, probeert de browser het bericht te ontleden met behulp van JSON.parse, wat u “onverwachte einde van invoer”-fouten kan geven als de geleverde bytelengte komt niet overeen met de gegevens.


Antwoord 7

Ik deed dit in Node JS en het loste dit probleem op:

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

Antwoord 8

spoiler: mogelijk Probleem aan de serverzijde

Dit is wat ik heb gevonden, mijn code verwachtte de reactie van mijn server, toen de server slechts 200 code retourneerde, was het niet genoeg hieruit json parser de fout gegooid fout onverwacht einde van invoer

fetch(url, {
        method: 'POST',
        body: JSON.stringify(json),
        headers: {
          'Content-Type': 'application/json'
        }
      })
        .then(res => res.json()) // here is my code waites the responce from the server
        .then((res) => {
          toastr.success('Created Type is sent successfully');
        })
        .catch(err => {
          console.log('Type send failed', err);
          toastr.warning('Type send failed');
        })

Antwoord 9

Ik heb dezelfde fout gehad bij het parseren van een tekenreeks met \n in JSON. De oplossing was om string.replace('\n','\\n')

te gebruiken


Antwoord 10

Deze fout treedt op bij het lezen van een leeg JSON-bestand.

Om deze fout in NodeJS te voorkomen, controleer ik de bestandsgrootte:

const { size } = fs.statSync(JSON_FILE);
const content = size ? JSON.parse(fs.readFileSync(JSON_FILE)) : DEFAULT_VALUE;

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes