Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在JSON解析和Stringify中是否有一种变通方法,可以在自定义引擎不使用';I don’我不接受这种规范_Javascript_Json_Date_Parsing_Stringify - Fatal编程技术网

Javascript 在JSON解析和Stringify中是否有一种变通方法,可以在自定义引擎不使用';I don’我不接受这种规范

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()命令无法解释该字符串格

背景故事一周来,我一直在绞尽脑汁,试图简单地用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对象的检测并改变其编码方式是徒劳的

对象结构变得字符串化

{
  "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]));