我正在序列化从MongoDB中获取的JSON并将其返回到通过$ .ajax调用请求它的javascript客户端。
$ .ajax调用如下所示:
function server_request(URL, httpMethod, dataObject) {
var output = "";
var typeofData = "json";
var dataToSend;
console.log('server_request ajax [' + httpMethod + '] request to ' + URL + ' with ' + JSON.stringify(dataObject));
if (dataObject !== null) {
dataToSend = JSON.stringify(dataObject);
$.ajax({
type: httpMethod,
async: false,
dataType: typeofData,
data: { jsonPost: dataToSend },
timeout: 2000, // Timeout in milliseconds
url: URL,
success: function (data) {
output = data;
}
, error: function (jqXHR, textStatus, errorThrown) {
console.log('Ajax post error jqXHR: ' + JSON.stringify(jqXHR));
console.log('Ajax post error: ' + textStatus);
output = new Object();
output.textStatus = textStatus;
output.errorThrown = errorThrown;
output.nutshell = 'n/a - exception thrown';
console.log('Ajax post error: ' + JSON.stringify(output));
}
});
}
在服务器上,我从MVC控制器返回JSON,如下所示:
return new ContentResult { Content = responseDoc.ToJson(), ContentType = "application/json" };
其中responseDoc是MongoDB BsonDocument。
只要我在JSON中没有日期元素,一切正常。只要添加了一个如下所示的元素:\"usersynctimestamp\" : new Date(1378905216401)
,那么$ .ajax调用就会失败并显示parsererror。
当它失败时,我仍然可以通过错误XHR数据看到有问题的JSON,如下所示:
Ajax post error jqXHR: {"readyState":4,"responseText":"{ \"nutshell\" : \"yes\", \"mongoDocument\" : { \"_id\" : { \"$binary\" : \"TJop8k0+KUKfrEVzI/vV+A==\", \"$type\" : \"03\" }, \"companyname\" : \"Apple\", \"databasename\" : \"Apple\", \"users\" : [{ \"_id\" : { \"$binary\" : \"y2dgrURxUEq/iCdI/eIoPw==\", \"$type\" : \"03\" }, \"email\" : \"marketpoint@evoite.com\", \"firstname\" : \"Ian\", \"password\" : \"aa\", \"surname\" : \"Smith\" }], \"usersynctimestamp\" : new Date(1378905216401) }, \"mongoDocumentCollectionName\" : \"clients\" }","status":200,"statusText":"OK"}
因此,似乎$ .ajax不喜欢MongoDB C#驱动程序中序列化程序创建的新Date()语法。任何人都可以建议我如何解决这个问题?
非常感谢
答案 0 :(得分:0)
您需要强制MongoDB驱动程序输出严格的json,如下所示:
string jsonStrictString = responseDoc.ToJson(new MongoDB.Bson.IO.JsonWriterSettings()
{
GuidRepresentation = GuidRepresentation.CSharpLegacy,
Indent = false,
OutputMode = MongoDB.Bson.IO.JsonOutputMode.Strict
});
这将允许$ .ajax正确解析响应。