json ayrıştırma hatası sözdizimi hatası beklenmedik girdi sonu
Aşağıdaki kod parçasını aldım
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);
}
});
}
Veri değerini sabit kodladığıma dikkat edin. Veriler veritabanına sorunsuz bir şekilde aktarılıyor. Ancak, "parsing error syntax error unexpected end of input" hatasını almaya devam ediyorum. Verilerimin doğru JSON sözdiziminde olduğundan eminim. Chrome denetçisi Network ile kontrol ettiğimde saveProduct isteği verilerin doğru olduğunu gösterdi.
{ "Name": "AA" }
Bu POST isteğine yanıt gelmedi. Bu yüzden ayrıştırma hatasının nereden kaynaklandığını bilmiyorum. FireFox tarayıcısını kullanmayı denedim. aynı şey oldu.
Birisi sorunun ne olduğuna dair bir fikir verebilir mi?
Teşekkürler,
P.S. İşte kontrolör kodu
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
Sorunun ne olduğunu kesin olarak söyleyemem. Kötü bir karakter olabilir, başında ve sonunda bıraktığınız boşluklar olabilir, hiçbir fikrim yok.
Her neyse, JSON'unuzu sizin yaptığınız gibi string olarak kodlamamalısınız. Bunun yerine JSON verilerini sunucuya göndermenin doğru yolu bir JSON serileştirici kullanmaktır:
Şimdi sunucuda da bu girdiyi almayı bekleyen uygun görünüm modeline sahip olduğunuzdan emin olun:
ve ilgili eylem:
Şimdi bir şey daha var. Siz
dataType: 'json'
belirttiniz. Bu, sunucunun bir JSON sonucu döndürmesini beklediğiniz anlamına gelir. Denetleyici eylemi JSON döndürmelidir. Denetleyici eyleminiz bir görünüm döndürüyorsa bu, aldığınız hatayı açıklayabilir. Bu, jQuery sunucudan gelen yanıtı ayrıştırmaya çalıştığında olur:Bununla birlikte, çoğu durumda, bir ASP.NET MVC denetleyici eylemine AJAX isteği yaparken genellikle
dataType
özelliğini ayarlamanız gerekmez. Bunun nedeni, belirli birActionResult
(örneğin birViewResult
veya birJsonResult
) döndürdüğünüzde, framework otomatik olarak doğruContent-Type
yanıt HTTP başlığını ayarlayacaktır. jQuery daha sonra yanıtı ayrıştırmak için bu başlığı kullanacak ve zaten ayrıştırılmış olan başarı geri çağrısına parametre olarak besleyecektir.Burada yaşadığınız sorunun sunucunuzun geçerli JSON döndürmemesinden kaynaklandığından şüpheleniyorum. Ya bir ViewResult ya da PartialViewResult döndürdü ya da denetleyici eyleminizde bazı bozuk JSON'ları manuel olarak oluşturmaya çalıştınız (ki bunu asla yapmamalısınız, bunun yerine JsonResult kullanmalısınız).
Yeni fark ettiğim bir şey daha var:
Lütfen bu niteliği yanlış olarak ayarlamaktan kaçının. Bu niteliği
false
olarak ayarlarsanız, isteğin tüm yürütülmesi sırasında istemci tarayıcısını dondurmuş olursunuz. Bu durumda sadece normal bir istekte bulunabilirsiniz. AJAX kullanmak istiyorsanız, asenkron olaylar ve geri aramalar açısından düşünmeye başlayın.Bir Node
http
isteği kullanıyordum vedata
olayını dinliyordum. Bu olay verileri yalnızca geçici olarak bir tampona koyar ve bu nedenle tam bir JSON mevcut değildir. Düzeltmek için, herdata
olayı bir değişkene eklenmelidir. Birine yardımcı olabilir (http://nodejs.org/api/http.html).Benim için sorun isim/değer çiftindeki tek tırnak işaretlerinden kaynaklanıyordu... data: "{'Name':'AA'}"
İsim/değer çifti için çift tırnak olarak değiştirdiğimde sorunsuz çalışıyor... data: '{"Name":"AA"}' veya bunun gibi... data: "{\"Name\":\"AA\"}"