помилка розбору 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);
        }
    });
}

Зверніть увагу, що я жорстко закодував значення даних. Дані потрапляють в базу даних нормально. Однак, я продовжую отримувати помилку &quo ;синтаксична помилка синтаксису неочікуваний кінець введення&quo ;. Я впевнений, що мої дані мають правильний синтаксис 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();
            }
        }
    }
}
Рішення

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

У будь-якому випадку, ви не повинні жорстко кодувати свій 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, почніть мислити категоріями асинхронних подій і зворотних викликів.

Коментарі (10)

Я використовував запит Node http і слухав подію data. Ця подія лише тимчасово поміщає дані в буфер, і тому повний JSON недоступний. Для виправлення потрібно кожну подію data додавати до змінної. Може комусь допоможе (http://nodejs.org/api/http.html).

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

Для мене проблема полягала в одинарних лапках для пари ім'я/значення... data: "{'Name':'AA'}"

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

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