error de análisis json error de sintaxis final inesperado de la entrada

Tengo el siguiente fragmento de código

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

Observe que he codificado el valor de los datos. Los datos son empujados en la base de datos bien. Sin embargo, sigo recibiendo el error "error de parsing error de sintaxis inesperado final de la entrada". Estoy seguro de que mis datos están en la sintaxis JSON correcta. Cuando he comprobado con en la red de Chrome inspector de la solicitud saveProduct mostró los datos es correcta.

{ "Name": "AA" }

Esta solicitud POST no tuvo respuesta. Así que no tengo ni idea de dónde viene el error de análisis. Intenté usar el navegador FireFox y ocurrió lo mismo.

¿Puede alguien dar alguna idea de lo que está mal?

Gracias,

P.D. Aquí está el código del controlador

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();
            }
        }
    }
}
Solución

No puedo decir con seguridad cuál es el problema. Podría ser algún carácter malo, podría ser los espacios que has dejado al principio y al final, ni idea.

De todas formas, no deberías codificar tu JSON como cadenas de texto como has hecho. En su lugar, la forma correcta de enviar datos JSON al servidor es utilizar un serializador JSON:

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

Ahora en el servidor también asegúrate de que tienes el modelo de vista adecuado esperando recibir esta entrada:

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

y la acción correspondiente:

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

Ahora hay una cosa más. Has especificado dataType: 'json'. Esto significa que esperas que el servidor devuelva un resultado JSON. La acción del controlador debe devolver JSON. Si su acción del controlador devuelve una vista, esto podría explicar el error que está obteniendo. Es cuando jQuery intenta analizar la respuesta del servidor:

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

Dicho esto, en la mayoría de los casos, no es necesario establecer la propiedad dataType cuando se hace una petición AJAX a una acción de controlador ASP.NET MVC. La razón de esto es que cuando se devuelve algún ActionResult específico (como un ViewResult o un JsonResult), el framework establecerá automáticamente la cabecera HTTP de respuesta Content-Type correcta. jQuery utilizará entonces esta cabecera para analizar la respuesta y alimentarla como parámetro al callback de éxito ya analizado.

Sospecho que el problema que tiene aquí es que su servidor no devolvió un JSON válido. O bien devolvió un ViewResult o un PartialViewResult, o bien intentaste elaborar manualmente algún JSON roto en tu acción de controlador (lo que obviamente nunca deberías hacer, sino utilizar el JsonResult en su lugar).

Una cosa más que acabo de notar:

async: false,

Por favor, evite poner este atributo en false. Si se establece este atributo a false se está congelando el navegador del cliente durante toda la ejecución de la solicitud. En este caso podrías hacer una petición normal. Si quieres usar AJAX, empieza a pensar en términos de eventos asíncronos y callbacks.

Comentarios (10)

Estaba usando una petición Node http y escuchando el evento data. Este evento sólo pone los datos en un buffer temporalmente, y por lo tanto un JSON completo no está disponible. Para solucionarlo, cada evento data debe ser anexado a una variable. Podría ayudar a alguien (http://nodejs.org/api/http.html).

Comentarios (0)

En mi caso, el problema se debe a las comillas simples del par nombre/valor... data: "{'Name':'AA'}"

Una vez que lo cambié a comillas dobles para el par nombre/valor funciona bien... data: '{"Nombre":"AA"}' o así... data: '{"Nombre":"AA"}"

Comentarios (1)