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语法书写的。当我用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();
            }
        }
    }
}
解决办法

我不能确定问题出在哪里。可能是一些不好的字符,可能是你在开头和结尾留下的空格,不知道。

总之,你不应该像你所做的那样把你的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,请开始考虑异步事件和回调。

评论(10)

我在使用Node的http请求并监听data事件。 这个事件只是将数据暂时放入一个缓冲区,因此无法获得完整的JSON。 要解决这个问题,必须将每个data事件附加到一个变量上。可能会对某人有所帮助(http://nodejs.org/api/http.html)。

评论(0)

对我来说,这个问题是由于名称/值对的单引号造成的...... data: "{'Name':'AA'}"

一旦我把名字/值对改成双引号,就能正常工作了...... data: '{"Name":"AA"}' 或者像这样... data: "{"Name":"AA"}"

评论(1)