我将用jQuery首次尝试Ajax。我正在将数据放到页面上,但对于Date数据类型返回的JSON数据,我遇到了一些问题。基本上,我得到的字符串是这样的:
/Date(1224043200000)/
从一个对JSON完全陌生的人那里——我如何将其格式化为短日期格式?这应该在jQuery代码中的某个地方处理吗?我使用$.datepicker.formatDate()尝试了jQuery.UI.datepicker插件,但没有成功。
仅供参考:以下是我使用以下答案组合得出的解决方案:
function getMismatch(id) {
$.getJSON("Main.aspx?Callback=GetMismatch",
{ MismatchId: id },
function (result) {
$("#AuthMerchId").text(result.AuthorizationMerchantId);
$("#SttlMerchId").text(result.SettlementMerchantId);
$("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
$("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
$("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
$("#LastUpdatedBy").text(result.LastUpdateNt);
$("#ProcessIn").text(result.ProcessIn);
}
);
return false;
}
function formatJSONDate(jsonDate) {
var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
return newDate;
}
这个解决方案从回调方法中获取了我的对象,并使用日期格式库在页面上正确显示了日期。
在jQuery1.5中,只要您有json2.js来覆盖较旧的浏览器,就可以反序列化来自Ajax的所有日期,如下所示:
(function () {
var DATE_START = "/Date(";
var DATE_START_LENGTH = DATE_START.length;
function isDateString(x) {
return typeof x === "string" && x.startsWith(DATE_START);
}
function deserializeDateString(dateString) {
var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
return utcDate;
}
function convertJSONDates(key, value) {
if (isDateString(value)) {
return deserializeDateString(value);
}
return value;
}
window.jQuery.ajaxSetup({
converters: {
"text json": function(data) {
return window.JSON.parse(data, convertJSONDates);
}
}
});
}());
我包含了一个逻辑,假设您以UTC格式发送服务器上的所有日期(您应该这样做);消费者然后获得一个JavaScript Date对象,该对象具有适当的记号值来反映这一点。也就是说,在日期上调用getUTCHours()等将返回与服务器上相同的值,而调用getHours()将返回用户浏览器确定的本地时区值。
这没有考虑带有时区偏移的WCF格式,尽管添加起来相对容易。
我最终将“字符”添加到Panos的正则表达式中,以消除Microsoft序列化程序在将对象写入内联脚本时生成的字符:
所以,如果你的C#代码中有一个属性
protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}
在你的aspx中
<script type="text/javascript">
var myObject = '<%= JsonObject %>';
</script>
你会得到类似的东西
var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';
注意双引号。
为了将其转换为eval将正确反序列化的形式,我使用了:
myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
我使用原型,为了使用它,我添加了
String.prototype.evalJSONWithDates = function() {
var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
return jsonWithDates.evalJSON(true);
}
原始示例:
/Date(1224043200000)/
不反映WCF使用内置JSON序列化通过WCF REST发送日期时使用的格式。(至少在.NET 3.5 SP1上)
我发现这里的答案很有用,但需要对正则表达式进行轻微的编辑,因为似乎时区GMT偏移被附加到WCF JSON中返回的数字(自1970年以来)。
在WCF服务中,我有:
[OperationContract]
[WebInvoke(
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest
)]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );
ApptVisitLinkInfo的定义很简单:
public class ApptVisitLinkInfo {
string Field1 { get; set; }
DateTime Field2 { get; set; }
...
}
当“Field2”作为Json从服务返回时,值为:
/Date(1224043200000-0600)/
请注意作为值的一部分包含的时区偏移。
修改后的正则表达式:
/\/Date\((.*?)\)\//gi
它稍显急切,并抓住了家长之间的一切,而不仅仅是第一个数字。生成的时间sinze 1970,加上时区偏移都可以输入eval以获得日期对象。
替换产生的JavaScript行是:
replace(/\/Date\((.*?)\)\//gi, "new Date($1)");
JSON可能会返回某种类型的对象(嗯,是其字符串表示)。
"{ myDate : Date(1224043200000) }"
使用jQuery,您可以通过以下方式访问数据对象:
$.get(
"myJSONFile.php",
function (data) {
// data.myDate will be a date object.
// to show in a short date format (eg: dd/mm/yyyy)
alert (
data.myDate.getDate() + "/"
+ (data.myDate.getMonth() + 1) + "/"
+ data.myDate.getFullYear()
); // alerts: "15/10/2008"
}
);