σφάλμα ανάλυσης 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);
        }
    });
}

Παρατηρήστε ότι έχω κωδικοποιήσει την τιμή των δεδομένων. Τα δεδομένα προωθούνται στη βάση δεδομένων μια χαρά. Ωστόσο, λαμβάνω συνεχώς το σφάλμα "σφάλμα ανάλυσης σφάλμα σύνταξης απροσδόκητο τέλος της εισόδου". Είμαι σίγουρος ότι τα δεδομένα μου είναι σε σωστή σύνταξη JSON. Όταν το έλεγξα με το Network of Chrome inspector η αίτηση saveProduct έδειξε ότι τα δεδομένα είναι σωστά.

{ "Name": "AA" }

Αυτό το αίτημα POST δεν είχε απάντηση. Έτσι, δεν έχω ιδέα από πού προερχόταν το σφάλμα ανάλυσης. Δοκίμασα να χρησιμοποιήσω το πρόγραμμα περιήγησης FireFox.

Μπορεί κάποιος να δώσει κάποια ιδέα για το τι συμβαίνει;

Ευχαριστώ,

Υ.Γ. Εδώ είναι ο κώδικας του ελεγκτή

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 θα χρησιμοποιήσει στη συνέχεια αυτή την επικεφαλίδα για να αναλύσει την απόκριση και να την τροφοδοτήσει ως παράμετρο στο callback επιτυχίας που έχει ήδη αναλυθεί.

Υποψιάζομαι ότι το πρόβλημα που αντιμετωπίζετε εδώ είναι ότι ο διακομιστής σας δεν επέστρεψε έγκυρο JSON. Είτε επέστρεψε κάποιο ViewResult ή ένα PartialViewResult, είτε προσπαθήσατε να δημιουργήσετε χειροκίνητα κάποιο σπασμένο JSON στην ενέργεια του ελεγκτή σας (κάτι που προφανώς δεν θα έπρεπε ποτέ να κάνετε, αλλά να χρησιμοποιείτε το JsonResult αντί αυτού).

Ένα ακόμη πράγμα που μόλις παρατήρησα:

async: false,

Παρακαλώ, αποφύγετε να θέσετε αυτό το χαρακτηριστικό σε ψευδές. Εάν ορίσετε αυτό το χαρακτηριστικό σε false, παγώνετε το πρόγραμμα περιήγησης του πελάτη κατά τη διάρκεια ολόκληρης της εκτέλεσης της αίτησης. Θα μπορούσατε να κάνετε απλά μια κανονική αίτηση σε αυτή την περίπτωση. Αν θέλετε να χρησιμοποιήσετε AJAX, αρχίστε να σκέφτεστε με όρους ασύγχρονων συμβάντων και callbacks.

Σχόλια (10)

Χρησιμοποιούσα ένα αίτημα Node http και άκουγα το συμβάν data. Αυτό το συμβάν τοποθετεί τα δεδομένα μόνο προσωρινά σε ένα buffer και έτσι δεν είναι διαθέσιμο ένα πλήρες JSON. Για να διορθωθεί, κάθε συμβάν data πρέπει να προσαρτάται σε μια μεταβλητή. Ίσως βοηθήσει κάποιον (http://nodejs.org/api/http.html).

Σχόλια (0)

Για μένα το πρόβλημα οφειλόταν στα απλά εισαγωγικά για το ζεύγος ονόματος/τιμής... data: "{'Name':'AA'}"

Μόλις το άλλαξα σε διπλά εισαγωγικά για το ζεύγος ονόματος/τιμής λειτουργεί μια χαρά... data: '{"Όνομα":"AA"}&#39, ή έτσι... data: "{\"Όνομα\":\"AA\"}&quot,

Σχόλια (1)