ant*_*tfx 4 javascript json node.js
我正在编写一个服务nodejs来替换用.NET. 该服务提供了一个 JSON API,其中一个调用返回一个日期。JSON 的 Microsoft 日期格式是/是其中1599890827000的毫秒偏移量:
/Date(1599890827000)/
我遇到的问题是JSON.stringify(在res.send和res.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 服务。
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 中的行为将是更向前兼容的解决方案。
使用替换参数
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)
| 归档时间: |
|
| 查看次数: |
14548 次 |
| 最近记录: |