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

请注意,我对数据值进行了硬编码。数据被很好地插入数据库。但是,我不断收到错误

parsing error syntax error unexpected end of input

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

{ "Name": "AA" }

此 POST 请求没有响应。所以我对解析错误的来源一无所知。我尝试使用 FireFox 浏览器。同样的事情发生了。

谁能给出一些关于哪里出了问题的想法?

谢谢,

附: 这是 Controller 代码

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

现在在服务器上还要确保你有正确的 View 模型来接收这个输入:

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

以及对应的 Action :

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

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

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

话虽如此,在大多数情况下,当向 ASP.NET MVC Controller 操作发出 AJAX 请求时,通常不需要设置 dataType 属性。这样做的原因是因为当你返回一些特定的ActionResult(比如一个ViewResult或者一个JsonResult)时,框架会自动设置正确的Content-Type 响应 HTTP header 。然后,jQuery 将使用此 header 解析响应并将其作为参数提供给已解析的成功回调。

我怀疑您在这里遇到的问题是您的服务器没有返回有效的 JSON。它要么返回一些 ViewResult 或 PartialViewResult,要么您尝试在 Controller 操作中手动制作一些损坏的 JSON(显然您不应该这样做,而是使用 JsonResult 代替)。

我刚刚注意到的另一件事:

async: false,

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

https://stackoverflow.com/questions/20827372/

相关文章:

c# - asp.net core 1.0 web api使用camelcase

java - 对象数组与对象对象

javascript - 从名称、值 JSON 数组中获取一项

ios - 如何在 Swift 中组合两个 Dictionary 实例?

java - jackson JSON : get node name from json-tree

json - 如何加密散列 JSON 对象?

python - 在 json 中发送 NaN

java - 从 JSONArray 转换为 String 然后再转换回来

javascript - 如何使用 JSON 数据填充选择框的选项?

jquery - 将json加载到变量中