簡體   English   中英

強制JSON.stringify轉義正斜杠(即`\ /`)

[英]Force JSON.stringify to escape forward slash (i.e. `\/`)

我正在用nodejs編寫一個服務來替換用.NET編寫的現有系統。 該服務提供了一個JSON API,其中一個調用返回一個日期。 JSON的Microsoft日期格式是/,其中1599890827000是毫秒偏移量:

/Date(1599890827000)/

我遇到的問題是JSON.stringify (在express使用res.sendres.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM