我使用jquery与REST API进行通信。 (ASP.net Web API)。
我创建了一个简单的对象,然后使用jquery在服务器上“PUT”它:
var myObject = {
name: 'just a name',
createDate: new Date()
}
$.ajax({
url: 'https://myServer/api/person/1',
dataType: 'json',
method: 'put',
data: myObject
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
查看Firebug中的网络流量,我可以看到我的createDate propery通过以下方式发送:
Tue Feb 02 2016 14:40:26 GMT+0100 (W. Europe Standard Time)
这将是new Date().toString()
我的API不喜欢这样,它接受多种格式的日期,并且能够很好地处理正常的JSON版本:
new Date().toJSON()
results to: "2016-02-02T13:45:37.069Z"
如何处理?我宁愿不必通过“手动”将每个日期转换为JSON来发布我的对象,这样就可以轻松地处理复杂对象。
我能做什么(警告真的很脏的技巧),覆盖日期对象的默认toString方法:
Date.prototype.toString = new Date().toJSON
这有效......但是......你好!
有什么想法?
答案 0 :(得分:2)
JSON.stringify
采用“replacer”参数,可以是几个东西,包括可用于为属性生成适当值的函数。您可以使用它来替换服务器随后将检测到的格式并转回日期。
示例:
var data = {
dt: new Date()
};
document.body.innerHTML = JSON.stringify(data, function(key, value) {
if (value instanceof Date) {
return value.toISOString();
}
return value;
});
或者是Microsoft的首选/Date(mssinceepoch)/
:
document.body.innerHTML = JSON.stringify(data, function(key, value) {
if (value instanceof Date) {
return "/Date(" + value.getTime() + ")/";
}
return value;
});
无论哪种方式,您的服务器部分都必须检测那些(通过密钥的名称,或通过值的模式等)并将它们转换回日期。
您的ajax
来电将更改为:
var myObject = {
name: 'just a name',
createDate: new Date()
};
$.ajax({
url: 'https://myServer/api/person/1',
contentType: 'json',
method: 'put',
data: JSON.stringify(myObject, myReplacerFunction)
});
唯一的区别是致电JSON.stringify
。此外,您已将dataType: 'json'
置于通话中,但如果您发送 JSON,则使用contentType
告诉服务器它是什么,而不是dataType
; dataType
告诉jQuery你希望服务器发送回来。
答案 1 :(得分:0)
所以,感谢T.J。的回答和一些进一步的探索,这就是我想出来的,有人可能会觉得它很有用。
目标:发布一个包含日期的对象,将它们作为JSON通过该行发送。锦上添花:使用LOCALIZED日期对象而不是UTC日期,因为我碰巧喜欢它;)
/*
add a toJSONlocal method to the date object
takes the date, corrects the time zone and gives json output without the 'Z' at the end
*/
Date.prototype.toJSONlocal = function() {
var local = new Date(this);
local.setMinutes(this.getMinutes() - this.getTimezoneOffset());
return local.toJSON().substring(0,23)
}
/*
replacer function to use with JSON.stringify()
checks if the received string is an ISO Date, if so make it local.
*/
jsonDateLocalizer = function(key, value) {
if(typeof value == 'string' && value.match(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/)) {
return(new Date(value).toJSONlocal())
}
return value;
};
var myObject = {
name: 'Bobby Tables',
createDate: new Date()
}
$.ajax({
url: 'https://myServer/api/person/1', // send it here
dataType: 'json', // expect json in return
method: 'put', // let's do a PUT request
contentType:"application/json; charset=utf-8", //tell the server I'm sending json.
data: JSON.stringify(myObject, jsonDateLocalizer) // here you go, json data, with dates the way I like 'em
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;