json parsing error syntax error unexpected end of input

Aku punya potongan kode berikut

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);
        }
    });
}

Perhatikan bahwa saya sulit dikodekan data nilai. Data-data yang bisa mendorong ke database baik-baik saja. Namun, saya terus mendapatkan kesalahan "parsing error syntax error unexpected end of input". Saya yakin saya data adalah benar JSON sintaks. Ketika aku memeriksa pada Jaringan Chrome inspektur saveProduct permintaan menunjukkan data yang benar.

{ "Name": "AA" }

POSTING ini permintaan tidak memiliki respon. Jadi saya tidak mengerti di mana kesalahan parse adalah berasal dari. Saya mencoba menggunakan browser FireFox. hal yang sama terjadi.

Siapa pun dapat memberikan beberapa ide untuk apa yang salah?

Terima kasih,

P. S. Berikut ini adalah controller code

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();
            }
        }
    }
}
Mengomentari pertanyaan (5)
Larutan

Saya dapat't mengatakan dengan pasti apa masalahnya. Bisa beberapa karakter buruk, bisa menjadi ruang yang tersisa di awal dan di akhir, tidak ada ide.

Lagi pula, anda tidak't hardcode JSON anda sebagai string seperti yang telah anda lakukan. Bukan cara yang tepat untuk mengirim data JSON ke server menggunakan JSON serializer:

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

Sekarang pada server juga pastikan bahwa anda memiliki tepat melihat model mengharapkan untuk menerima masukan ini:

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

dan tindakan yang sesuai:

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

Sekarang ada's satu hal lagi. Anda telah ditentukan dataType: &#39;json&#39;. Ini berarti bahwa anda berharap bahwa server akan mengembalikan JSON hasil. Controller tindakan harus mengembalikan JSON. Jika anda pengendali aksi kembali pandangan ini bisa menjelaskan kesalahan yang anda dapatkan. It's ketika jQuery upaya untuk mengurai respon dari server:

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

Ini dikatakan, dalam kebanyakan kasus, biasanya anda don't perlu mengatur dataType properti ketika membuat permintaan AJAX ke ASP.NET MVC controller tindakan. Alasan untuk ini adalah karena ketika anda kembali beberapa spesifik ActionResult (seperti ViewResult atau JsonResult), kerangka kerja ini akan secara otomatis mengatur benar Content-Type respon HTTP header. jQuery kemudian akan menggunakan header ini untuk mengurai respon dan pakan sebagai parameter keberhasilan callback yang sudah diurai.

Saya menduga bahwa masalah yang anda hadapi di sini adalah bahwa server anda tidak't kembali berlaku JSON. Itu baik kembali beberapa ViewResult atau PartialViewResult, atau anda mencoba untuk secara manual kerajinan beberapa patah JSON dalam aksi controller (yang jelas anda tidak harus melakukan tapi menggunakan JsonResult sebaliknya).

Satu hal lagi yang saya perhatikan:

async: false,

Silakan, menghindari pengaturan ini atribut palsu. Jika anda mengatur atribut ini untuk palsu anda adalah pembekuan browser klien selama seluruh pelaksanaan permintaan. Anda bisa membuat permintaan yang normal dalam kasus ini. Jika anda ingin menggunakan AJAX, mulai berpikir dalam kerangka peristiwa asinkron dan callback.

Komentar (10)

Saya menggunakan Node http permintaan dan mendengarkan data acara. Acara ini hanya menempatkan data ke dalam buffer sementara, dan begitu lengkap JSON tidak tersedia. Untuk memperbaiki, masing-masing data acara harus ditambahkan ke variabel. Mungkin bisa membantu seseorang (http://nodejs.org/api/http.html).

Komentar (0)

Bagi saya masalah adalah karena tanda kutip tunggal untuk nama/nilai pasangan... data: "{'Nama':'AA'"

Setelah aku berubah ke tanda kutip ganda untuk nama/nilai pasangan itu bekerja dengan baik... data: '{"":"AA"}' atau seperti ini... data: "{\"\":\"AA\""

Komentar (1)

Mungkin itu akan berguna.

Metode parameter nama harus sama seperti itu memiliki JSON

Ini akan bekerja dengan baik

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),

Ini TIDAK akan bekerja dengan baik

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),
Komentar (0)

Tak terduga akhir dari masukan berarti bahwa parser telah berakhir sebelum waktunya. Misalnya, mungkin akan mengharapkan "abcd...wxyz" tetapi hanya melihat "abcd...wxy.

Ini bisa menjadi typo kesalahan di suatu tempat, atau hal itu bisa menjadi masalah yang anda dapatkan ketika pengkodean dicampur di bagian yang berbeda dari aplikasi.

Salah satu contoh: pertimbangkan anda menerima data dari aplikasi asli menggunakan chrome.runtime.sendNativeMessage:

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

Sekarang sebelum panggilan balik anda disebut, browser akan mencoba untuk menguraikan pesan yang menggunakan JSON.mengurai yang dapat memberikan anda "tak terduga akhir input" kesalahan jika disediakan byte panjang tidak sesuai dengan data.

Komentar (0)

Saya melakukan ini di Node JS dan memecahkan masalah ini:

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

spoiler: mungkin Server Side Masalah

Berikut adalah apa yang saya've ditemukan, kode saya diharapkan respon dari server saya, ketika server kembali hanya 200 kode, itu tidak cukup herefrom json parser dilemparkan kesalahan kesalahan yang tak terduga akhir input

fetch(url, { metode: &#39;POST&#39;, tubuh: JSON.stringify(json), header: { &#39;Content-Type&#39;: &#39;application/json&#39; } }) .kemudian(res => res.json()) // di sini adalah kode saya waites dengan respon dari server .kemudian((res) => { toastr.sukses(&#39;Menciptakan Jenis yang dikirim berhasil&#39;); }) .catch(err => { konsol.log(&#39;Jenis mengirim gagal&#39;, err); toastr.peringatan(&#39;Jenis mengirim gagal&#39;); })

Komentar (0)