JSON 解析エラー 構文エラー 予期しない入力の終了 質問する

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

{ "Name": "AA" }

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

何が問題なのか、誰かわかるでしょうか?

ありがとう、

PS コントローラーのコードはこちら

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

ベストアンサー1

何が問題なのかはっきりとは言えません。文字が間違っているのかもしれませんし、先頭と末尾にスペースが残っているのかもしれません。わかりません。

いずれにせよ、JSON を文字列としてハードコードするべきではありません。代わりに、JSON データをサーバーに送信する適切な方法は、JSON シリアライザーを使用することです。

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

ここで、サーバー上で、この入力を受け取ることを想定した適切なビュー モデルがあることを確認します。

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

対応するアクション:

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

ここでもう 1 つあります。 を指定しましたdataType: 'json'。これは、サーバーが JSON の結果を返すことを期待していることを意味します。コントローラー アクションは JSON を返す必要があります。コントローラー アクションがビューを返す場合、これがエラーの原因である可能性があります。これは、jQuery がサーバーからの応答を解析しようとするときです。

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

そうは言っても、ほとんどの場合、dataTypeASP.NET MVC コントローラー アクションに AJAX 要求を行うときに、プロパティを設定する必要はありません。その理由は、特定のものActionResult( や などViewResult)を返すとJsonResult、フレームワークが自動的に正しいContent-Type応答 HTTP ヘッダーを設定するためです。jQuery は、このヘッダーを使用して応答を解析し、解析済みの成功コールバックにパラメーターとして渡します。

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

私が今気づいたもう一つのこと:

async: false,

この属性を false に設定しないでください。この属性を false に設定すると、falseリクエストの実行中ずっとクライアント ブラウザがフリーズします。この場合は、通常のリクエストを行うことができます。AJAX を使用する場合は、非同期イベントとコールバックについて考え始めてください。

おすすめ記事