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);
});