erro de sintaxe de análise do json erro de sintaxe inesperado final de entrada

Tenho a seguinte peça 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);
        }
    });
}

Repare que eu codifiquei o valor dos dados. Os dados são empurrados para a base de dados. Entretanto, continuo recebendo o erro " analisando erro de sintaxe de erro inesperado final de input". Tenho certeza de que meus dados estão na sintaxe JSON correta. Quando verifiquei no Network of Chrome inspector, o pedido de guardarProduto mostrou que os dados estão correctos.

{ "Name": "AA" }

Este pedido de POST não teve resposta. Por isso, não sei de onde veio o erro parse. Eu tentei usar o navegador FireFox. Aconteceu a mesma coisa.

Alguém pode dar alguma ideia do que está errado?

Obrigado,

P.S. Aqui está o código do 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();
            }
        }
    }
}
Solução

Eu posso'não posso dizer ao certo qual é o problema. Pode ser algum mau carácter, podem ser os espaços que te restam no início e no fim, não faço ideia.

De qualquer forma, você não deve' não deve codificar o seu JSON como se fosse um fio. Em vez disso, a forma adequada de enviar dados JSON para o servidor é usar um JSON serializador:

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

Agora no servidor também se certifique de que você tem o modelo de visualização adequado esperando receber essa entrada:

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

e a acção correspondente:

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

Agora, mais uma coisa... 39; mais uma coisa. Você especificou dataType: 'json'. Isto significa que você espera que o servidor retorne um resultado JSON. A ação do controlador deve retornar JSON. Se a ação do seu controlador retornar uma view, isto pode explicar o erro que você está recebendo. It's quando jQuery tenta analisar a resposta do servidor:

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

Dito isto, na maioria dos casos, normalmente você não'não precisa definir a propriedade dataType ao fazer uma requisição AJAX para uma ação do controlador ASP.NET MVC. A razão para isto é porque quando você retorna algum ActionResult' específico (como umViewResult' ou um JsonResult'), o framework irá automaticamente definir o cabeçalho HTTP de resposta corretoContent-Type'. jQuery irá então utilizar este cabeçalho para analisar a resposta e alimentá-la como parâmetro para o retorno de chamada de sucesso já analisado.

Eu suspeito que o problema que você está tendo aqui é que o seu servidor não't retornou JSON válido. Ou retornou algum ViewResult ou um PartialViewResult, ou você tentou criar manualmente algum JSON quebrado em sua ação de controle (o que obviamente você nunca deveria estar fazendo, mas usando o JsonResult em seu lugar).

Mais uma coisa que eu acabei de notar:

async: false,

Por favor, evite definir este atributo como falso. Se você definir este atributo como falso você está congelando o navegador do cliente durante toda a execução do pedido. Você poderia apenas fazer uma requisição normal neste caso. Se você quiser usar AJAX, comece a pensar em termos de eventos assíncronos e callbacks.

Comentários (10)

Eu estava utilizando um pedido de Node http e ouvindo o evento data. Este evento apenas coloca os dados em um buffer temporariamente, e assim um JSON completo não está disponível. Para corrigir, cada evento dados deve ser anexado a uma variável. Pode ajudar alguém (http://nodejs.org/api/http.html).

Comentários (0)

Para mim o problema foi devido a citações simples para o nome/valor do par... data: "{'Name':'AA'}"

Assim que o mudei para aspas duplas para o nome/valor do par, funciona bem... dados: '{"Nome":"AA"}' ou assim... dados: ""Nome":"AA"}"

Comentários (1)