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

ant*_*tfx 4 javascript json node.js

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

/Date(1599890827000)/

我遇到的问题是JSON.stringify(在res.sendres.jsonin 中使用express)不会转义正斜杠,但现有的 Microsoft 库(System.Web.Script.Serialization.JavaScriptSerializer)希望转义正斜杠。

例如,客户端期望这样的 JSON:

{
  "Expires": "\/Date(1599890827000)\/"
}
Run Code Online (Sandbox Code Playgroud)

JSON.stringify产生以下内容:

{
  "Expires": "/Date(1599890827000)/"
}
Run Code Online (Sandbox Code Playgroud)

第二个结果完全有效,但 Microsoft 库不喜欢它并且无法解析。

有什么办法可以强制 Express/Node/JSON 转义正斜杠JSON.stringify或处理这种情况?

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

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

Stu*_*eld 5

Replacer 在 escaping 之前发生,给你留下:

"/Date(1599890827000)/"
Run Code Online (Sandbox Code Playgroud)

或者:

"\\/Date(1599890827000)\\/"
Run Code Online (Sandbox Code Playgroud)

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

JSON.stringify(data).replace(/\//g, '\\/');
Run Code Online (Sandbox Code Playgroud)

这意味着您将无法使用内置的 express res.json(data),可能需要编写一个函数来替换它,例如:

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, '\\/'));
}
Run Code Online (Sandbox Code Playgroud)

称之为:

app.get('/url', function (req, res) {
     dotNetJSONResponse(res, data);
});
Run Code Online (Sandbox Code Playgroud)

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


gur*_*372 3

使用替换参数

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

var jsonString = JSON.stringify(jsonString, replaceSlashes);
Run Code Online (Sandbox Code Playgroud)

它仍然会产生一个双反斜杠,因为 stringify 方法本身不会产生一个斜杠而不转义相同的斜杠。\

你需要尝试这样的事情

JSON.stringify({
  "Expires": "\/Date(1599890827000)\/"
}, replaceSlashes).replace(/\\\\/g, "\\");
Run Code Online (Sandbox Code Playgroud)