помилка розбору 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();
}
}
}
}
52
3
Я не можу точно сказати, в чому проблема. Можливо, якийсь поганий персонаж, можливо, пробіли, які ви залишили на початку і в кінці, не знаю.
У будь-якому випадку, ви не повинні жорстко кодувати свій JSON як рядки, як ви це зробили. Замість цього правильним способом відправки даних JSON на сервер є використання серіалізатора JSON:
Тепер на сервері також переконайтеся, що у вас є відповідна модель подання, яка очікує отримати ці дані:
і відповідну дію:
Тепер є ще один момент. Ви вказали
dataType: 'json'
. Це означає, що ви очікуєте, що сервер поверне результат у форматі JSON. Дія контролера повинно повертати JSON. Якщо ваша дія контролера повертає представлення, це може пояснити помилку, яку ви отримуєте. Це відбувається, коли jQuery намагається розібрати відповідь від сервера:При цьому, в більшості випадків, зазвичай, вам не потрібно встановлювати властивість
dataType
при виконанні AJAX запиту до дії контролера ASP.NET MVC. Причиною цього є те, що коли ви повертаєте якийсь конкретнийActionResult
(наприклад,ViewResult
абоJsonResult
), фреймворк автоматично встановить правильний заголовок HTTP відповідіContent-Type
. jQuery потім буде використовувати цей заголовок для розбору відповіді і передасть його в якості параметра в уже розібраний зворотний виклик успіху.Я підозрюю, що проблема полягає в тому, що ваш сервер не повернув валідний JSON. Він або повернув якийсь ViewResult або PartialViewResult, або ви намагалися вручну створити якийсь пошкоджений JSON у вашій дії контролера (чого, очевидно, ніколи не слід робити, а замість цього використовувати JsonResult).
Ще одна річ, яку я щойно помітив:
Будь ласка, не встановлюйте цей атрибут у значення false. Якщо ви встановите цей атрибут у значення
false
, ви заморозите клієнтський браузер на весь час виконання запиту. Ви можете просто зробити звичайний запит в цьому випадку. Якщо ви хочете використовувати AJAX, почніть мислити категоріями асинхронних подій і зворотних викликів.Я використовував запит Node
http
і слухав подіюdata
. Ця подія лише тимчасово поміщає дані в буфер, і тому повний JSON недоступний. Для виправлення потрібно кожну подіюdata
додавати до змінної. Може комусь допоможе (http://nodejs.org/api/http.html).Для мене проблема полягала в одинарних лапках для пари ім'я/значення... data: "{'Name':'AA'}"
Після того, як я змінив це на подвійні лапки для пари ім'я/значення, все працює нормально... data: '{"Name":"AA"}' або ось так data: "{\"Name\":\"AA\"}"