2016-03-07 141 views
0

我正在編寫nodejs中的服務,該服務替換了現有系統中編寫的.NET。該服務提供了一個JSON API,其中一個調用返回一個日期。對於JSON微軟日期格式爲/就是1599890827000是毫秒偏移:強制JSON.stringify轉義正斜槓(即` /`)

/Date(1599890827000)/

我遇到的問題是,JSON.stringify(在expressres.sendres.json使用)不逃避正斜槓,但現有的Microsoft庫(System.Web.Script.Serialization.JavaScriptSerializer)預計正斜槓將被轉義。

例如,客戶希望JSON是這樣的:

{ 
    "Expires": "\/Date(1599890827000)\/" 
} 

JSON.stringify產生如下:

{ 
    "Expires": "/Date(1599890827000)/" 
} 

第二個結果是完全有效的,但微軟庫不喜歡它,解析失敗。

有沒有什麼辦法可以強制Express/Node/JSON在JSON.stringify中轉義正斜槓或處理這種情況?

我可以運行stringify後,而是因爲我們的項目將是非常哈克不得不發送到客戶端,而不是讓之前轉換成JSON使用對象緩存系統的使用正則表達式替換。

注:我不能更改客戶端,只有api服務。

+1

*「但現有的Microsoft庫(System.Web.Script.Serialization.JavaScriptSerializer)預計正斜槓進行轉義」 *不以我的經驗。這將是非常奇怪的,因爲完全沒有理由在JSON或JavaScript中轉義它們。我懷疑你的問題在別處。 –

+0

奇怪的事實,但沒有逃脫的斜槓我得到這個異常'System.FormatException:/日期(1599898027000)/不是一個有效的DateTime值.'我不能更改客戶端 – antfx

回答

3

使用replacer參數

function replaceSlashes(key, value) 
{ 
    if (typeof value == "string") 
    { 
    value = value.replace(/\//g, "\\/"); 
    } 
    return value; 
} 

var jsonString = JSON.stringify(jsonString, replaceSlashes); 

本身並沒有逃脫同樣沒有產品單斜線它仍然會產生一個雙反斜線因爲字符串化方法。\

你需要嘗試像這

JSON.stringify({ 
    "Expires": "\/Date(1599890827000)\/" 
}, replaceSlashes).replace(/\\\\/g, "\\"); 
+0

@antfx檢查現在 – gurvinder372

+0

@TJCrowder請檢查現在,它正在逃跑 – gurvinder372

+0

謝謝,但這樣會產生'\\ /日期(1599890827000)\\ /',而不是'\ /日期(1599890827000)\ /'我猜是因爲字符串化,然後逃離新反斜線 – antfx

2

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將是更向前兼容的解決方案。

+0

是啊,這是我在想什麼:( – antfx