it-swarm.com.ru

ошибка синтаксического разбора 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();
            }
        }
    }
}
43
Shawn

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

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

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

async: false,

Пожалуйста, не устанавливайте для этого атрибута значение false. Если вы установите для этого атрибута значение false, вы замораживаете браузер клиента в течение всего выполнения запроса. Вы можете просто сделать нормальный запрос в этом случае. Если вы хотите использовать AJAX, начните думать с точки зрения асинхронных событий и обратных вызовов.

66
Darin Dimitrov

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

4
Ben

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

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

1
Vish

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

data: '{"Name":"AA"}'
0
Rajaprabhu Aravindasamy

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

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

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

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

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

0
Pacerier

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

Имя параметра метода должно быть таким же, как у 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),
0
Academy of Programmer

Я сделал это, и это решило эту проблему.

var data = JSON.parse (Buffer.concat (arr) .toString ());

PS: в узле JS

0
Victor Michael Kosgei