WCF服务接受简单的JSON字符串,但拒绝JSON设置为400错误

dek*_*n88 6 javascript sqlite ajax wcf json

我目前正在开发一个PhoneGap应用程序,它通过WCF Web服务与我们的数据库通信.

我已经向服务器提出了很多请求并且没有问题地检索数据但是在每种情况下我只是将一些参数作为我手动创建的JSON字符串传递(没有字符串化).现在我在尝试从本地SQLite数据库读取时遇到了问题,然后将信息作为JSON发送到Web服务.该服务返回400错误,具有以下内容:

反序列化操作'uploadData'的请求消息体时出错.OperationFormatter遇到无效的Message正文.期望找到名称为"type"且值为"object"的属性.找到值'数组'.

我按如下方式编码JSON:

database.transaction(function(tx) {
    var query = "SELECT * FROM someTable WHERE something=something";
    tx.executeSql(query, [], function(tx, results) {
        var resultSet = new Array();

        for (i=0; i<results.rows.length; i++) {
            var row = results.rows.item(i);
            resultSet[i] = row;         
        }

        var json = JSON.stringify(resultSet);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用jQuery通过ajax请求发送JSON字符串:

$.ajax({
            type: "POST",
            url: "http://someurl/myService.svc/uploadData",
            contentType: "application/json; charset=utf-8",
            data: json,
            dataType: "json",
            success: function (data) {/*do something*/}, 
            error: function(jqXHR, textStatus, errorThrown) {
                $('#test').html(textStatus + " - " + errorThrown + " - " + jqXHR.responseText);
            }
        }); 
Run Code Online (Sandbox Code Playgroud)

我的网络服务只是不断抛出相同的错误.我的问题是这样的...如何从本地数据库中读取并将结果集转换为可通过ajax发送的可用JSON字符串.

提前致谢.如果需要更多信息或问题不明,请告诉我,我会尽力提供更多信息.

编辑:尝试删除stringify但我仍然得到400错误.这次错误有点不同:

反序列化操作'uploadData'的请求消息体时出错.OperationFormatter遇到无效的Message正文.遇到意外的角色'你'.

编辑:我发现即使手动创建的完全有效的JSON字符串仍会导致错误.发送一些参数时不会发生这种情况,例如:

{"name" : "dean", "age" : 23}
Run Code Online (Sandbox Code Playgroud)

它工作得很好.它只拒绝一系列结果,例如:

[{"name" : "dean", "age" : 23},{"name" : "bob", "age" : 25}]
Run Code Online (Sandbox Code Playgroud)

该方法在WCF接口中定义如下:

 [OperationContract]
 [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json,
          RequestFormat = WebMessageFormat.Json)]

 string uploadData(string data);
Run Code Online (Sandbox Code Playgroud)

对于WCF服务而言,它似乎比JSON字符串本身更具问题.有谁知道为什么WCF会接受一个简单的JSON字符串但拒绝一个集合?这是一个完全停止项目开发的主要问题,所以非常感谢任何帮助!

已解决: 我没有直接传递编码的JSON字符串,而是发送了另一个带有键"data"的JSON字符串的值.所以,如上所述我的SQLite结果为:

var json = JSON.stringify(resultSet);
Run Code Online (Sandbox Code Playgroud)

然后我将它传递给WCF服务,如下所示:

...
data: JSON.stringify({ data : json }),
...
Run Code Online (Sandbox Code Playgroud)

它现在工作正常.

Mat*_*hew -1

JSON.stringify步骤是不必要的,因为 jQuery 的 AJAX 引擎会自动执行此操作。只需将结果集数组作为data请求选项中的属性传递即可:

...
data: resultSet,
...
Run Code Online (Sandbox Code Playgroud)

您现在要做的是将数组字符串化为 JSON,然后要求 jQuery 将结果字符串重新字符串化为 JSON,然后再将其发送到服务器。