web-dev-qa-db-ja.com

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構文であると確信しています。 Network of Chromeインスペクターでチェックすると、saveProductリクエストでデータが正しいことが示されました。

{ "Name": "AA" }

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

誰が何が間違っているのかについていくつかのアイデアを与えることができますか?

おかげで、

追伸ここにコントローラーコードがあります

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

問題が何であるかを確実に言うことはできません。悪いキャラクターかもしれませんし、最初と最後に残したスペースかもしれません。

とにかく、あなたがやったように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" });
}

これは、ほとんどの場合、通常、ASP.NET MVCコントローラーアクションにAJAXリクエストを行うときにdataTypeプロパティを設定する必要はないということです。これは、特定のActionResultViewResultJsonResultなど)を返すときに、フレームワークが自動的に正しいContent-Type応答HTTPヘッダーを設定するためです。 jQueryはこのヘッダーを使用して応答を解析し、既に解析された成功コールバックにパラメーターとして渡します。

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

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

async: false,

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

69
Darin Dimitrov

Node httpリクエストを使用し、dataイベントをリッスンしていました。このイベントは、データを一時的にバッファに入れるだけなので、完全なJSONは使用できません。修正するには、各dataイベントを変数に追加する必要があります。誰かを助けるかもしれません( http://nodejs.org/api/http.html )。

4
Ben

役に立つかもしれません。

メソッドパラメータ名はJSONのように同じである必要があります

それはうまくいきます

C#

public ActionResult GetMTypes(int id)

JS

 var params = { id: modelId  };
                 var url = '@Url.Action("GetMTypes", "MaintenanceTypes")';
                 $.ajax({
                     type: "POST",
                     url: url,
                     contentType: "application/json; charset=utf-8",
                     dataType: "json",
                     data: JSON.stringify(params),

うまく動作しません

C#

public ActionResult GetMTypes(int modelId)

JS

 var params = { id: modelId  };
                 var url = '@Url.Action("GetMTypes", "MaintenanceTypes")';
                 $.ajax({
                     type: "POST",
                     url: url,
                     contentType: "application/json; charset=utf-8",
                     dataType: "json",
                     data: JSON.stringify(params),
1
Developer

私にとって、この問題は名前と値のペアの単一引用符によるものでした...データ: "{'Name': 'AA'}"

名前と値のペアの二重引用符に変更したら、正常に動作します... data: '{"Name": "AA"}'またはこのように... data: "{\" Name\":\" AA\"}"

1
Vish

一重引用符を使用してみてください、

data: '{"Name":"AA"}'

入力の予期しない終了は、パーサーが途中で終了したことを意味します。たとえば、"abcd...wxyz"を期待しているかもしれませんが、"abcd...wxyしか見えません。

これは、typoエラーのどこか、またはアプリケーションのさまざまな部分でエンコードが混在している場合に発生する問題である可能性があります。

1つの例:chrome.runtime.sendNativeMessageを使用してネイティブアプリからデータを受信して​​いるとします。

chrome.runtime.sendNativeMessage('appname', {toJSON:()=>{return msg}}, (data)=>{
    console.log(data);
});

これで、コールバックが呼び出される前に、ブラウザはJSON.parseを使用してメッセージを解析しようとします。 指定されたバイト長 はデータと一致しません。

0
Pacerier

Node JSでこれを行い、この問題を解決しました。

var data = JSON.parse(Buffer.concat(arr).toString());