web-dev-qa-db-ja.com

無効なJSONプリミティブ:id

以下の機能が正常に動作しません。シリアル化が間違っているようです。これは、さまざまなデータバリアントの約5回目の反復です。私は元々、WCFでの作業と同じように、データ:{'id':id}を実行していましたが、ASMXでは機能していません。データをid:1234ではなくid = 1234としてシリアル化しているように見えますが、私はこれにかなり慣れていません。どんな助けでもいただければ幸いです。ああ、ブラウザで直接サービスを呼び出すことができ、データが正しく返されるので、サービスではないことがわかります。

function getVentID(id) {
    //look up id in database and get VentID
    alert('id: ' + id);
    var jsdata = { "id": + id}
    $.ajax({
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        url: 'services/UserService.asmx/getVentID',
        data: jsdata,
        dataType: 'json',
        success: function (msg) {
            alert(msg.d);
        },
        error: function (a, b, c) {
            alert('Error: ' + a.toString() + ' ' + b.toString() + " " + c.toString());
        }
    });
}

p.s.私は10の同じ質問があることを知っていますが、それらのどれも私が見つけることができた、または私のために働いた答えを持っていません。

14

考えられる最も簡単な修正は、var jsdataで始まる行を次のように変更することです。

var jsdata = '{id:' + id + '}';

問題は、jQueryがjsdataをjsonではなくフォームデータとしてエンコードしていることです。 dataTypeパラメーターは、POSTデータのエンコード方法ではなく、応答の解析方法に影響します。

私の知る限り、jQueryには実際にはJSONシリアル化コードはありません。どうやら ジョン・レシグはダグラス・クロックフォードのjson2.jsの使用を提案しています

これを使用するには、json.jsへのスクリプト参照を追加してから:

var jstext = JSON.stringify(jsdata, null, 2);
32
sblom

私は今この問題を解決しました。

次の形式でURLを渡す必要があります。

http://domain.com.br/service.asmx/method?objParam= {q: "search"}

また、service.asmxファイルで、次のメソッドを宣言する必要があります。

Public Function method(objParam As Dictionary(Of String, String)) 

End Function

コードでは、次のようになります。

function getVentID(id) {
  var jsdata = {
    "id": +id
  }
  var sData = JSON.stringify(jsdata); //convert your json in string
  $.ajax({
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    url: 'services/UserService.asmx/getVentID',
    data: {
      id: sData
    },
    dataType: 'json',
    success: function(msg) {
      alert(msg.d);
    },
    error: function(a, b, c) {
      alert('Error: ' + a.toString() + ' ' + b.toString() + " " + c.toString());
    }
  });
}
0