1. ホーム
  2. jquery

[解決済み】JSONパースエラー シンタックスエラー 予期せぬ入力の終了

2022-01-24 08:15:28

質問

次のようなコード片を入手しました。

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構文であることを確認しています。Chromeのインスペクタのネットワークで確認したところ、saveProductのリクエストでデータが正しく表示されました。

{コード

このPOSTリクエストには応答がありませんでした。そのため、どこからパースエラーが発生したのか、さっぱりわかりません。FireFoxブラウザで試してみましたが、同じことが起こりました。

何が問題なのか、どなたかお分かりになる方はいらっしゃいますか?

ありがとうございます。

追伸 以下は、コントローラのコードです。

{ "Name": "AA" }

解決するには?

何が問題なのか、はっきりしたことは言えません。文字が悪いのかもしれないし、最初と最後に空白が残っているのかもしれない。

とにかく、あなたのようにJSONを文字列としてハードコーディングするのはやめましょう。JSONデータをサーバーに送信する正しい方法は、JSONシリアライザーを使用することです。

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

さて、サーバー上でも、この入力を受け取るための適切なビューモデルがあることを確認してください。

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

と対応するアクションを指定します。

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

さて、もうひとつ。あなたが指定した [HttpPost] public ActionResult SaveProduct(UserViewModel model) { ... } . これは、サーバーがJSONの結果を返すことを期待していることを意味します。コントローラのアクションはJSONを返す必要があります。もしコントローラのアクションがビューを返すのであれば、 このエラーは説明がつくでしょう。これは、jQuery がサーバからのレスポンスをパースしようとしたときに発生します。

dataType: 'json'

とはいえ、ほとんどの場合、通常は [HttpPost] public ActionResult SaveProduct(UserViewModel model) { ... return Json(new { Foo = "bar" }); } プロパティは、ASP.NET MVCコントローラのアクションにAJAXリクエストを行う際に使用します。この理由は、ある特定の dataType (例えば {{コード または ActionResult) の場合、フレームワークは自動的に正しい ViewResult jQuery はこのヘッダを使用してレスポンスを解析し、すでに解析されている success コールバックのパラメータとして送ります。

ここであなたが抱えている問題は、サーバーが有効なJSONを返さなかったことだと思われます。ViewResultやPartialViewResultを返したか、コントローラのアクションで壊れたJSONを手動で作ろうとしたかです(これは明らかに、JsonResultを代わりに使うべきではありません)。

もう一つ、今気づいたのですが

JsonResult

この属性にfalseを設定することは避けてください。もし、この属性を Content-Type は、リクエストの実行中にクライアントブラウザをフリーズさせることになります。この場合、通常のリクエストを行うだけでよいでしょう。もしAJAXを使いたいのであれば、非同期イベントとコールバックの観点から考え始めてください。