[英]Force JSON.stringify to escape forward slash (i.e. `\/`)
我正在用nodejs
編寫一個服務來替換用.NET
編寫的現有系統。 該服務提供了一個JSON API,其中一個調用返回一個日期。 JSON的Microsoft日期格式是/,其中1599890827000
是毫秒偏移量:
/Date(1599890827000)/
我遇到的問題是JSON.stringify
(在express
使用res.send
和res.json
)不會轉義正斜杠但現有的Microsoft庫( System.Web.Script.Serialization.JavaScriptSerializer )期望轉義斜杠被轉義。
例如,客戶端期望JSON像這樣:
{
"Expires": "\/Date(1599890827000)\/"
}
但是JSON.stringify
產生以下內容:
{
"Expires": "/Date(1599890827000)/"
}
第二個結果完全有效,但Microsoft庫不喜歡它並且無法解析。
有什么辦法可以強制Express / Node / JSON在JSON.stringify
轉義正斜杠或處理這種情況嗎?
我可以在運行stringify
后使用正則表達式替換,但由於我們在項目中使用的對象緩存系統,在發送到客戶端而不是讓它之前必須轉換為JSON是非常hacky。
注意:我無法更改客戶端,只能更改api服務。
在逃離之前發生替換,留下以下任何一種:
"/Date(1599890827000)/"
要么:
"\\/Date(1599890827000)\\/"
實際上,您必須在結果輸出上運行字符串替換:
JSON.stringify(data).replace(/\//g, '\\/');
這意味着您將無法使用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, '\\/'));
}
將其稱為:
app.get('/url', function (req, res) {
dotNetJSONResponse(res, data);
});
但是 ,這就是說,修復.NET中的行為將是更具前瞻性的解決方案。
使用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, "\\");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.