[解決済み】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のリクエストでデータが正しく表示されました。
{コード
この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を使いたいのであれば、非同期イベントとコールバックの観点から考え始めてください。
関連
-
[解決済み】jQuery: outer html() [重複]。
-
[解決済み] jQuery .load()が動作しない
-
[解決済み] リーフレット - 既存のマーカーを検索したり、マーカーを削除するには?
-
[解決済み] JQueryの使用 - フォームが送信されないようにする
-
[解決済み] クラス別のjquery onclick
-
[解決済み] jQueryやJavaScriptを使用してURLパラメータを取得するには?
-
[解決済み] jQuery .validate() submitHandler が起動しない
-
[解決済み] jQuery動的セレクタ
-
[解決済み] UnixツールでJSONをパースする
-
[解決済み] RubyでJSON文字列をパースする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] jQuery .load()が動作しない
-
[解決済み] Javascriptでの改行の分割方法
-
[解決済み] How to make the first option of <select> selected with jQuery
-
[解決済み] jQueryは、すべてのテキストフィールドの値の合計を計算する
-
[解決済み] jQueryでページスクロールをプログラム的に無効にする方法
-
[解決済み] クラス別のjquery onclick
-
[解決済み] 右から検索トグル
-
[解決済み] ネストした多次元のjsonオブジェクトの書き方
-
[解決済み] jQueryとIntraweb?
-
[解決済み] asp.net mvcのHtml.BeginForm()にIDプロパティを追加する方法は?