我正在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服务。
答案 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, "\\");