我收到了以下代码
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语法。当我在Chrome of Chrome检查器上查看时,saveProduct请求显示数据是正确的。
{ "Name": "AA" }
此POST请求没有响应。所以我对解析错误的来源毫无头绪。我尝试过使用FireFox浏览器。同样的事情发生了。
任何人都可以对错误提出一些看法吗?
谢谢,
P.S。 这是控制器代码
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();
}
}
}
}
答案 0 :(得分:68)
我无法确定问题是什么。可能是一些不好的角色,可能是你在开始和结束时留下的空间,不知道。
无论如何,你不应该像你所做的那样将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
(例如ViewResult
或JsonResult
)时,框架将自动设置正确的Content-Type
响应HTTP标头。然后,jQuery将使用此标头来解析响应并将其作为参数提供给已解析的成功回调。
我怀疑你在这里遇到的问题是你的服务器没有返回有效的JSON。它要么返回一些ViewResult,要么返回PartialViewResult,或者你试图在你的控制器动作中手动制作一些破碎的JSON(显然你不应该这样做,而是使用JsonResult)。
我刚注意到的另一件事是:
async: false,
请避免将此属性设置为false。如果将此属性设置为false
,则在整个请求执行期间冻结客户端浏览器。在这种情况下,您可以发出正常请求。如果你想使用AJAX,就要开始考虑异步事件和回调。
答案 1 :(得分:4)
我正在使用Node http
请求并侦听data
事件。此事件仅暂时将数据放入缓冲区,因此无法使用完整的JSON。要修复,必须将每个data
事件附加到变量。可以帮助某人(http://nodejs.org/api/http.html)。
答案 2 :(得分:2)
不要返回空的杰森
就我而言,我在Json
项目中返回了空.Net Core Web API
字符串。
所以我更改了代码
来自
return Ok();
收件人
return Ok("Done");
似乎您必须返回一些字符串或对象。
希望这会有所帮助。
答案 3 :(得分:1)
对我来说问题是由于名称/值对的单引号... 数据:&#34; {&#39;名称&#39;:&#39; AA&#39;}&#34;
一旦我将其更改为名称/值对的双引号,它就可以正常工作...... 数据:&#39; {&#34;名称&#34;:&#34; AA&#34;}&#39; 或者像这样...... 数据:&#34; {\&#34;姓名&#34;:\&#34; AA \&#34;}&#34;
答案 4 :(得分:1)
也许会有用。
方法参数名称应与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),
答案 5 :(得分:0)
意外的输入结束意味着解析器过早结束。例如,它可能期望"abcd...wxyz"
,但只能看到"abcd...wxy
。
这可能是某处的错误错误,或者当编码在应用程序的不同部分混合时可能会出现问题。
一个示例:假设您使用chrome.runtime.sendNativeMessage
从原生应用收到数据:
chrome.runtime.sendNativeMessage('appname', {toJSON:()=>{return msg}}, (data)=>{
console.log(data);
});
现在在之前调用您的回调,浏览器会尝试使用JSON.parse
来解析邮件,这可能会让您意外地结束输入&#34;如果supplied byte length与数据不匹配,则会出错。
答案 6 :(得分:0)
我在Node JS中这样做了,它解决了这个问题:
var data = JSON.parse(Buffer.concat(arr).toString());
答案 7 :(得分:0)
破坏者:可能是 服务器端问题
这是我发现的内容,我的代码期望服务器发出响应,当服务器仅返回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');
})
答案 8 :(得分:0)
我在将包含\n
的字符串解析为JSON时遇到了相同的错误。解决方案是使用string.replace('\n','\\n')
答案 9 :(得分:0)
在读取空的JSON文件时会发生此错误。
为避免在NodeJS中出现此错误,我正在检查文件的大小:
const { size } = fs.statSync(JSON_FILE);
const content = size ? JSON.parse(fs.readFileSync(JSON_FILE)) : DEFAULT_VALUE;
答案 10 :(得分:-1)
尝试使用单引号,
data: '{"Name":"AA"}'