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

时间:2013-12-29 16:30:00

标签: jquery ajax json asp.net-mvc-4 knockout.js

我收到了以下代码

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

11 个答案:

答案 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(例如ViewResultJsonResult)时,框架将自动设置正确的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"}'