Подтвердить что ты не робот

Json parsing ошибка синтаксиса ошибка неожиданный конец ввода

Я получил следующий фрагмент кода

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

Ответ 1

Не могу точно сказать, в чем проблема. Может быть, какой-то плохой характер, могли бы быть места, которые вы оставили в начале и в конце, не знаю.

Во всяком случае, вы никогда не должны жестко кодировать 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" });
}

В большинстве случаев обычно вам не нужно устанавливать свойство dataType при выполнении запроса AJAX для действия контроллера ASP.NET MVC. Причина этого в том, что, когда вы возвращаете некоторый определенный ActionResult (такой как ViewResult или JsonResult), среда автоматически установит правильный HTTP-заголовок ответа Content-Type. Затем jQuery будет использовать этот заголовок для синтаксического анализа ответа и подачи его как параметра в уже обработанный обратный вызов.

Я подозреваю, что проблема, с которой вы сталкиваетесь, заключается в том, что ваш сервер не возвратил действительный JSON. Он либо возвратил некоторый ViewResult или PartialViewResult, либо вы попытались вручную обработать какой-то сломанный JSON в действии вашего контроллера (что, очевидно, вы никогда не должны делать, но вместо этого используете JsonResult).

Ohhhh, и еще одна вещь, которую я только что заметил, что у меня забрызгали глаза:

async: false,

Серьезно? Пожалуйста, НИКОГДА НИКОГДА НИКОГДА не присваивайте этому атрибуту значение false. Я вижу, как люди делают это снова и снова и снова. Это возмутительно. Ребята, если вы установите этот атрибут на false, вы больше не выполняете AJAX. Вы блокируете/замораживаете клиентский браузер в течение всего выполнения запроса, убивая все преимущества, предоставляемые AJAX. Просто сделайте обычный запрос в этом случае. Не беспокойтесь о javascript. Если вы хотите сделать AJAX, прекратите думать в терминах процедурного и последовательного программирования. Начните думать в терминах асинхронных событий и обратных вызовов.

Ответ 2

Для меня проблема связана с одинарными кавычками для пары name/value... data: "{'Name': 'AA'}"

Как только я изменил его на двойные кавычки для пары имя/значение, он отлично работает... data: '{ "Name": "AA" }' или вот так... data: "{\" Name\ ": \" AA\ "}"

Ответ 3

Я использовал запрос Node http и слушал событие data. Это событие временно помещает данные в буфер, поэтому полный JSON недоступен. Чтобы исправить, каждое событие data должно быть добавлено к переменной. Может помочь кому-то (http://nodejs.org/api/http.html).

Ответ 4

Попробуйте использовать одиночные кавычки,

data: '{"Name":"AA"}'

Ответ 5

Неожиданный конец ввода означает, что парсер закончил преждевременно. Например, он может ожидать "abcd...wxyz", но видит только "abcd...wxy.

Это может быть ошибка опечатки где-нибудь, или это может быть проблемой, которую вы получаете, когда кодировки смешиваются в разных частях приложения.

Один пример: считайте, что вы получаете данные из собственного приложения с помощью chrome.runtime.sendNativeMessage:

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

Теперь до вызывается ваш обратный вызов, браузер попытается проанализировать сообщение с помощью JSON.parse, которое может дать вам "неожиданный конец ввода", если предоставленная длина байта не соответствует данным.