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

时间:2016-03-07 10:33:44

标签: javascript json node.js

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

/Date(1599890827000)/

我遇到的问题是JSON.stringify(在res.send中使用res.json中的express)不会转义正斜杠,而是现有的Microsoft库({{3期望转发斜杠转义。

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

{
  "Expires": "\/Date(1599890827000)\/"
}

JSON.stringify产生以下内容:

{
  "Expires": "/Date(1599890827000)/"
}

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

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

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

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

2 个答案:

答案 0 :(得分:4)

Replacer happens before escaping,留下您:

"/Date(1599890827000)/"

或者:

"\\/Date(1599890827000)\\/"

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

JSON.stringify(data).replace(/\//g, '\\/');

这意味着您将无法使用内置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, '\\/'));
}

将其称为:

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

然而,也就是说,修复.NET中的行为将是更具前瞻性的解决方案。

答案 1 :(得分:3)

使用replacer参数

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, "\\");