gpt4 book ai didi

Javascript JSON 日期反序列化

转载 作者:可可西里 更新时间:2023-11-01 02:18:32 26 4
gpt4 key购买 nike

我正在尝试反序列化其中包含 javascript 日期的 json 对象。在对象上调用 JSON.stringify 时,日期被序列化为未正确反序列化回日期的字符串。我尝试使用 chrome、IE 和 FF 的 native 浏览器实现以及使用 jquery 来反序列化对象。两者都给出了一些结果。这是片段:

var obj = {Date: new Date()};
var objSer = JSON.stringify(obj);
var objDeser = JSON.parse(objSer);
var objJqDeser = $.parseJSON(objSer);

function getYear(value){
try{
return value.getYear();
}
catch(err){
return err;
}
}

$("#orig").text("Orig Year: " + getYear(obj.Date));
$("#deser").text("Deser Year: " + getYear(objDeser.Date));
$("#jqDeser").text("JqDeser Year: " + getYear(objJqDeser.Date));

我希望 objDeser.Date 是一个 js 日期而不是一个字符串。你可以在这里看到这个问题:http://jsbin.com/unijud/24/edit .是否有任何 js 库可以在构建 javascript 对象时正确反序列化日期?

最佳答案

JSON.parse 有一个鲜为人知的第二个参数:'reviver' 函数。这正是用于此目的:在初始解析期间将日期字符串恢复为 Date 对象(或者,假设,您想要从字符串转换的任何其他类型的对象)。

有一个 SO post关于这个,这里有一个 blog post其中包括一个实现示例和一个函数,该函数将在解析为 Date 之前对几个常见的日期编码(ISO 和奇怪的 .NET AJAX 格式)进行属性检查。

这是该博文中的关键函数,fwiw:

// JSON date deserializer
// use as the second, 'reviver' argument to JSON.parse();

if (window.JSON && !window.JSON.dateParser) {
var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
var reMsAjax = /^\/Date\((d|-|.*)\)[\/|\\]$/;

JSON.dateParser = function (key, value) {
// first, just make sure the property is a string:
if (typeof value === 'string') {
// then, use regex to see if it's an ISO-formatted string
var a = reISO.exec(value);
if (a) {
// if so, Date() can parse it:
return new Date(value);
}
// otherwise, see if it's a wacky Microsoft-format string:
a = reMsAjax.exec(value);
if (a) {
// and perform some jujitsu to make use of it:
var b = a[1].split(/[-+,.]/);
return new Date(b[0] ? +b[0] : 0 - +b[1]);
}
// here, you could insert any additional tests and parse instructions you like, for other date syntaxes...
}
// important: you need to return any values you're not parsing, or they die...
return value;
};
}

// use: JSON.parse(json,JSON.dateParser);

(有 lots of opinions 关于 ISO 8601 日期的正确正则表达式。YMMV。此外,没有特别的理由将函数打到全局 JSON 对象上。您可以在任何您喜欢的地方存储/引用它。)

关于Javascript JSON 日期反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14488745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com