Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.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转义正斜杠(即`\/`)_Javascript_Json_Node.js - Fatal编程技术网

Javascript 强制JSON.stringify转义正斜杠(即`\/`)

Javascript 强制JSON.stringify转义正斜杠(即`\/`),javascript,json,node.js,Javascript,Json,Node.js,我正在nodejs中编写一个服务,它取代了.NET中编写的现有系统。该服务提供一个JSON API,其中一个调用返回一个日期。JSON的Microsoft日期格式是/是,其中1599890827000是毫秒偏移量: /Date(1599890827000)/ 我遇到的问题是JSON.stringify(用于res.send和express中的res.JSON)没有转义前斜杠,但现有的Microsoft库()希望转义前斜杠 例如,客户端希望JSON如下所示: { "Expires": "\/D

我正在
nodejs
中编写一个服务,它取代了
.NET
中编写的现有系统。该服务提供一个JSON API,其中一个调用返回一个日期。JSON的Microsoft日期格式是/是,其中
1599890827000
是毫秒偏移量:

/Date(1599890827000)/

我遇到的问题是
JSON.stringify
(用于
res.send
express
中的
res.JSON
)没有转义前斜杠,但现有的Microsoft库()希望转义前斜杠

例如,客户端希望JSON如下所示:

{
  "Expires": "\/Date(1599890827000)\/"
}
但是
JSON.stringify
会产生以下结果:

{
  "Expires": "/Date(1599890827000)/"
}
第二个结果完全有效,但Microsoft库不喜欢它,无法解析

我有没有办法强制Express/Node/JSON在
JSON.stringify
中转义前斜杠,或者处理这种情况?

在运行
stringify
之后,我可以使用正则表达式替换,但是由于我们在项目中使用了对象缓存系统,因此在发送到客户端之前必须转换为JSON,而不是让用户使用它,这将是非常有难度的

注意:我无法更改客户端,只能更改api服务。

使用参数

function replaceSlashes(key, value) 
{
  if ( typeof value == "string")
  {
    value = value.replace(/\//g, "\\/");
  }
  return value;
}

var jsonString = JSON.stringify(jsonString, replaceSlashes);
它仍然会生成一个双反斜杠,因为stringify方法本身不会生成一个斜杠而不转义相同的斜杠\

你需要试试这样的东西

JSON.stringify({
  "Expires": "\/Date(1599890827000)\/"
}, replaceSlashes).replace(/\\\\/g, "\\");
,留给您的是:

"/Date(1599890827000)/"
或:

实际上,您必须对结果输出运行字符串替换:

JSON.stringify(data).replace(/\//g, '\\/');
这意味着您将无法使用内置的express,可能需要编写一个函数来替换它,如:

function dotNetJSONResponse(res, data) {

    var app = res.app;
    var replacer = app.get('json replacer');
    var spaces = app.get('json spaces');
    var body = JSON.stringify(data, replacer, spaces);

    if (!this.get('Content-Type')) {
        res.set('Content-Type', 'application/json');
    }

    return res.send(body.replace(/\//g, '\\/'));
}
称之为:

app.get('/url', function (req, res) {
     dotNetJSONResponse(res, data);
});

不过,也就是说,修复.NET中的行为将是更具前向兼容性的解决方案。

“但现有的Microsoft库(System.Web.Script.Serialization.JavaScriptSerializer)希望转义前向斜杠”以我的经验来说不是这样。这将是非常奇怪的,因为根本没有理由用JSON或JavaScript来逃避它们。我怀疑您的问题在其他地方。确实奇怪,但如果没有转义的正斜杠,我会得到此异常
System.FormatException:/Date(15998027000)/不是有效的DateTime值。
并且我无法更改client@T.J.Crowder请现在检查,它正在转义谢谢,但这会产生
\\\/Date(1599890827000)\\/
而不是
\/Date(1599890827000)\/
我猜是因为stringify然后转义了新的backslash@antfx直接使用stringify方法是不可能的。您需要尝试类似于
JSON.stringify({“Expires”:“\/Date(1599890827000)\/”},replaceSlashes)。replace(/\\\\\/g,“\\”)
检查更新是的,它可以工作,但正如我在原始帖子中提到的,理想情况下,我希望在全局或Express中设置一些内容,因为我们使用了一个对象缓存系统use@antfx我不确定我是否理解了
,无论是在全球还是在Express中。对不起,我没有在Express.js上工作过,如果这是你的意思的话。是的,这就是我的想法:(
app.get('/url', function (req, res) {
     dotNetJSONResponse(res, data);
});