Javascript 在JSON解析和Stringify中是否有一种变通方法,可以在自定义引擎不使用';I don’我不接受这种规范
背景故事一周来,我一直在绞尽脑汁,试图简单地用JS存储和恢复日程安排日期。要在会话之间保存日期,我需要使用Stringify卸载单个字符串以保存为变量。我在一个定制引擎(Barco的Medialon)中编程JS,该引擎不允许包含或标准I/O。因此,所有东西都必须在这一块代码中工作,小事情不是标准的或需要解决办法 问题此JSON stringify命令以标准格式“2019-03-05T09:20:00.000Z”存储日期对象。但是,此特定的JSON解析//new date()命令无法解释该字符串格式,并创建“无效日期”错误。不过,其他格式也可以使用,即当我调用新日期(纪元时间)或新日期(YYYY、MM、DD、hh、MM)时 任务我正在尝试修改stringify/parse部分,以解决这个问题,尽管我很挣扎。虽然我对“JSON.parse”和regex位有一个很小的控制,但到目前为止,试图操纵Date对象的检测并改变其编码方式是徒劳的 对象结构变得字符串化Javascript 在JSON解析和Stringify中是否有一种变通方法,可以在自定义引擎不使用';I don’我不接受这种规范,javascript,json,date,parsing,stringify,Javascript,Json,Date,Parsing,Stringify,背景故事一周来,我一直在绞尽脑汁,试图简单地用JS存储和恢复日程安排日期。要在会话之间保存日期,我需要使用Stringify卸载单个字符串以保存为变量。我在一个定制引擎(Barco的Medialon)中编程JS,该引擎不允许包含或标准I/O。因此,所有东西都必须在这一块代码中工作,小事情不是标准的或需要解决办法 问题此JSON stringify命令以标准格式“2019-03-05T09:20:00.000Z”存储日期对象。但是,此特定的JSON解析//new date()命令无法解释该字符串格
{
"daily": "",
"special": [
{
"startDTG": "2019-03-05T09:20:00.000Z", // <- Without modifying the default stringify it gives this
"endDTG": "2019-03-06T09:20:00.000Z",
"mode": "0"
}
],
"current": {},
"startup": [],
"shutdown": []
}
但是,上面的方法无法检测日期对象。如果我使用(typeof value===“object”)
它激活的次数太多了
另一方面,这是不适用于此引擎的代码(但在其他任何地方都适用!)
目标我需要找到一个解决方案来解决这个引擎的局限性,它允许我在JSON.stringify过程中以另一种形式检测日期并将其转换为字符串,这也允许JSON.Parse函数检测并将其作为日期对象导入回去您尝试手动执行,但已经有了处理所有这些转换的方法 ISO认证日期: 国际标准化组织迄今: 对于
:00.000Z
格式,请参见以下答案:
Moment.js对于这类事情来说也是一个很好的省时工具:在
JSON.parse
回调中,您可以使用7个参数调用Date.UTC
,并将结果历元值传递给Date
构造函数,如下所示:
var p = value.match(/\d+/g);
return new Date(Date.UTC(p[0],p[1]-1,p[2],p[3],p[4],p[5],p[6]));
这假设字符串化日期使用带“Z”时区指示的UTC格式。这就是JSON.stringify
为日期生成的内容
演示:
var事件={
dt:新日期()
};
日志(“输入:”);
console.log(事件);
var eventSTR=JSON.stringify(事件);
console.log(“字符串化:”);
console.log(eventSTR);
var reISO=/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+Z$/;
var result=JSON.parse(eventSTR,函数(键,值){
if(typeof value==='string'&&reISO.test(value)){
var p=值。匹配(/\d+/g);
返回新日期(Date.UTC(p[0],p[1]-1,p[2],p[3],p[4],p[5],p[6]);
}
返回值;
});
log(“已解析:”);
控制台日志(结果)代码>TLDR问题到底是什么?请参阅“此发动机不工作…”:具体发生了什么?是正则表达式不起作用吗?是不是test
方法失败了?是新日期
曲解了这个论点吗?如果是,怎么做?有例外吗?@trincot故障本身发生在``新日期(“2019-03-06T09:20:00.000Z”);```时被调用。结果是一个格式不正确的日期对象,其中没有get函数工作。此引擎提供的调试器除了声明“无效日期”之外,没有其他抱怨。当我将Date对象键入一个字符串时,我只得到相同的“无效日期”@geoidesic我用一个更清楚的问题重新编写了目标部分。“但是,这并没有检测到字符串。”:我不理解这部分。您的原始对象是否不包含Date
对象?为什么它要检测(其他)字符串?@trincot我修正了字眼,这是代表我的大脑放屁,它没有检测日期对象。这个答案很有效!我必须补偿不同的格式,即0-11个月对1-12个月。谢谢你十倍@Anthony-p[1]
应该是p[1]-1
。这是一个ECMAScript的东西,不特定于IE。你能更新答案来修复月份索引吗?您不能像那样使用价差,因为月份仍然需要递减。:-)谢谢你对这个月的评论。更正。
eventLoad = JSON.parse(eventSTR, function (key, value) {
var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
if (typeof value === 'string' && reISO.test(value)){
return new Date(value); //value.slice(0,-5));
}
return value;
});
var p = value.match(/\d+/g);
return new Date(Date.UTC(p[0],p[1]-1,p[2],p[3],p[4],p[5],p[6]));