无效的JSON原始数据类型:id。

14

我无法使以下函数正常工作。看起来序列化出了问题。这已经是第五次尝试不同的数据变体了。最初,我只是像在工作中使用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个类似的问题,但我没有找到任何答案可以解决我的问题。

2个回答

33

最简单的修复方法是更改以var jsdata开头的行为:

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

问题在于jQuery将jsdata编码为表单数据而不是json。 dataType 参数影响响应的解析方式,而不是POST数据的编码方式。
据我所知,实际上在jQuery中没有任何JSON序列化代码。显然John Resig建议使用Douglas Crockford的json2.js
要使用它,请添加对json.js的脚本引用,然后:
var jstext = JSON.stringify(jsdata, null, 2);

1
嗯,从技术上讲,这解决了我发布的错误,但现在我得到了一个新的错误:无效的 Web 服务调用,参数值为“ID”缺失。"StackTrace":"at System.Web.Script.Services.WebServiceMethodData.CallMethod...等。有什么想法吗? - user736893
我尝试更改大小写,因为新的错误显示为ID而不是id,但这并没有帮助,我甚至不知道这是否相关... - user736893
嗯,我承认我不太清楚asmx到底需要什么。你在浏览器中直接运行的例子是什么?我可以帮助将其转换为jQuery调用。 - sblom
如果您还在,请更新您的已接受答案,以便帮助未来的谷歌搜索者。 - user736893

0

我现在解决了这个问题。

您需要按照以下格式传递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());
    }
  });
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接