JSON 解析错误语法错误意外结束输入

我得到了下面这段代码

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

注意,我硬编码了数据值。数据被很好地推送到数据库中。然而,我一直得到错误

解析错误语法错误意外输入结束

我确信我的数据是正确的 JSON 语法。当我在 Network of Chrome 检查器上检查的时候,saveProduct 请求显示数据是正确的。

{ "Name": "AA" }

此 POST 请求没有响应。所以我不知道解析错误是从哪里来的。我试过用火狐浏览器。同样的事情发生了。

有人能告诉我出了什么问题吗?

谢谢,

附言。 这是控制器代码

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();
}
}
}
}
523194 次浏览

我不能肯定问题出在哪里。可能是一些不好的性格,可能是你在开始和结束时留下的空白,没有主意。

无论如何,您不应该像以前那样将 JSON 硬编码为字符串。相反,将 JSON 数据发送到服务器的正确方法是使用 JSON 序列化程序:

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

现在,在服务器上还要确保您拥有正确的视图模型来接收这个输入:

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

以及相应的行动:

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

还有一件事。您已指定 dataType: 'json'。这意味着您期望服务器将返回一个 JSON 结果。控制器操作必须返回 JSON。如果您的控制器操作返回一个视图,这可以解释您得到的错误。当 jQuery 尝试解析来自服务器的响应时:

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

也就是说,在大多数情况下,在向 ASP.NET MVC 控制器操作发出 AJAX 请求时,通常不需要设置 dataType属性。这是因为当您返回一些特定的 ActionResult(例如 ViewResultJsonResult)时,框架将自动设置正确的 Content-Type响应 HTTP 头。然后 jQuery 将使用这个头来解析响应,并将其作为参数提供给已经解析的成功回调。

我怀疑您在这里遇到的问题是您的服务器没有返回有效的 JSON。它或者返回一些 ViewResult 或 PartialViewResult,或者您尝试在控制器操作中手动创建一些破碎的 JSON (显然您不应该这样做,而应该使用 JsonResult)。

我还注意到一件事:

async: false,

请避免将此属性设置为 false。如果将此属性设置为 false,则在整个请求执行期间将冻结客户端浏览器。在这种情况下,你可以提出一个正常的请求。如果您想使用 AJAX,那么开始考虑异步事件和回调。

对我来说,问题是由于名称/值对的单引号..。 Data: “{‘ Name’: ‘ AA’}”

一旦我把它改为名称/值对的双引号,它就可以正常工作了..。 Data: “{“ Name”: “ AA”}” 或者像这样。 Data: “{“ Name”: “ AA”}”

我正在使用 Nodehttp请求并监听 data事件。此事件只是将数据暂时放入缓冲区,因此不能使用完整的 JSON。要修复,必须将每个 data事件附加到一个变量。可能帮助某人(http://nodejs.org/api/http.html)。

意外的输入结束意味着解析器提前结束。例如,它可能期望看到 "abcd...wxyz",但只看到 "abcd...wxy

这可能是某处的 打印错误错误,也可能是在应用程序的不同部分混合编码时出现的问题。

一个例子: 假设您正在使用 chrome.runtime.sendNativeMessage从一个本地应用程序接收数据:

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

现在调用了 之前回调函数,浏览器将尝试使用 JSON.parse来解析消息,如果 提供的字节长度与数据不匹配,那么就会出现“意外的输入结束”错误。

我在 Node JS 中这样做,它解决了这个问题:

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

也许会有用。

方法参数名称应该与 JSON 相同

一切都会好起来的

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

它不会工作的罚款

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

剧透: 可能是 服务器端问题

下面是我发现的,我的代码期望从我的服务器的 回应,当服务器返回只有200代码,这是不够的,这里从 json 解析器抛出错误 输入的意外结束错误

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

不要归还空 Json

在 My Case 中,我在 .Net Core Web API项目中返回空 Json字符串。

所以我改了密码

 return Ok();

 return Ok("Done");

似乎必须返回一些字符串或对象。

希望这个能帮上忙。

我在将包含 \n的字符串解析为 JSON 时遇到了同样的错误

此错误发生在读取空 JSON 文件时。

为了避免在 NodeJS 中出现这个错误,我检查了文件的大小:

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