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();
            }
        }
    }
}
Çözüm

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:

data: JSON.stringify({ name : "AA" }),

Şimdi sunucuda da bu girdiyi almayı bekleyen uygun görünüm modeline sahip olduğunuzdan emin olun:

public class UserViewModel
{
    public string Name { get; set; }
}

ve ilgili eylem:

[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
    ...
}

Ş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:

[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
    ...
    return Json(new { Foo = "bar" });
}

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 bir ActionResult (örneğin bir ViewResult veya bir JsonResult) döndürdüğünüzde, framework otomatik olarak doğru Content-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:

async: false,

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.

Yorumlar (10)

Bir Node http isteği kullanıyordum ve data 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, her data olayı bir değişkene eklenmelidir. Birine yardımcı olabilir (http://nodejs.org/api/http.html).

Yorumlar (0)

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\"}"

Yorumlar (1)