ошибка разбора 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. Когда я проверил с помощью инспектора Network 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();
            }
        }
    }
}
Комментарии к вопросу (5)
Решение

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

В любом случае, вы не должны жестко кодировать ваш 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 затем использует этот заголовок для разбора ответа и передает его в качестве параметра в уже разобранный обратный вызов success.

Я подозреваю, что проблема, с которой вы столкнулись, заключается в том, что ваш сервер не вернул правильный 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"}' или вот так... данные: "{\"Имя\":\"AA\"}"

Комментарии (1)

Может быть это будет полезно.

Метод имя параметра должно быть таким же, как и в JSON

Он будет работать нормально

С#

public ActionResult GetMTypes(int id)

Яш

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

Не будет работать

С#

public ActionResult GetMTypes(int modelId)

Яш

 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),
Комментарии (0)

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

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

Один пример: рассмотрим, что вы получаете данные из родного приложения, используя хром.время выполнения.sendNativeMessage:

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

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

Комментарии (0)

Я сделал это в Node JS и он решил эту проблему:

var data = JSON.parse(Buffer.concat(arr).toString());
Комментарии (0)

спойлер: возможно стороны проблема с сервером

Вот что я'вэ нашел, мой код ожидали, что ответ с моего сервера, когда сервер вернул только 200 код, это не достаточно, отсюда в JSON парсер выкинул ошибку ошибка неожиданный конец

фетч(адрес, { метод: &#39;пост&#39;, тело: в JSON.преобразовать в строки(в JSON), заголовки: { &#39;контент-тип&#39;: &#39;приложение/JSON&#39; } }) .затем(РЭС => РЭС.формат JSON()) // вот мой код Вейтса ответ от сервера .тогда((РЭС) => { toastr.успех(&#39;создан на тип успешно отправлено&#39;); }) .поймать(энр => { консоль.журнал(&#39;типа отправить не удалось&#39;, ошибаться); toastr.предупреждение(&#39;типа отправить не удалось&#39;); })

Комментарии (0)