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;