2017-06-14 137 views
0

我遇到了一些情況,使用Json.NET將一些對象序列化爲JSON,然後註冊爲客戶端腳本塊。該對象的JSON被投入的JavaScript在一個單引號的文字有點像這樣:C# - 無法爲JSON轉義撇號

// javascript output, normal 
reportParameters = '{ "Location" : "My house" }'; 

但有時它需要投入包含撇號的值,比如「比利之家」,所以很明顯,我將需要逃避這一點,否則JavaScript的休息。

// javascript output scenario, bad 
reportParameters = '{ "Location" : "Billy's House" }'; 

// what I need is this 
reportParameters = '{ "Location" : "Billy\'s House" }'; 

我試着這樣做:

// C# input 
reportParameterText = reportParameterText.Replace("'", @"\'");` 

然而,這總是它更改爲「比利\\之家」,我不知道爲什麼。許多人們遇到類似問題的地方都會說「這只是調試器代表一個反斜槓的方式」,但在我的情況下,我仍然有2個反斜槓進入javascript,因此反斜槓會被轉義,而不是撇號和所有內容休息。

// javascript actual output, bad 
reportParameters = '{ "Location" : "Billy\\'s House" }'; 

我跟着它通過調試,和它之前,它被序列化後有兩個反斜槓,所以序列化是沒有問題的。正如我之前所說的,它絕對不僅僅是調試器對轉義字符的表示,因爲這些值會將其轉換爲源代碼。

其他的解決方案我試過,所有的C#:

reportParameterText = reportParameterText.Replace("'", "\'"); // No change 

reportParameterText = reportParameterText.Replace("'", "\\'"); // Creates 2 backslashes 

reportParameterText = reportParameterText.Replace("'", @"[%]"); 
reportParameterText = reportParameterText.Replace(@"[%]", @"\'"); // Creates 2 backslashes 

問題:爲什麼我總是得到2個反斜線,我怎麼能保證我只放下了嗎?

這是.NET 4

SOLUTION

感謝您的幫助和信息,大家好。我通過結合幾個人的建議並基本上做了@ Ali123的建議來解決我的問題。至於C#中「第二個反斜槓來自哪裏」的問題,它與@Gusman的答案如下。

我在C#中的序列化字符串在JavaScript中不是安全的字符串,但它仍然是格式正確的JSON。任何東西的JS黑盒子都接受一個JSON對象的字符串,這個JSON對象留在reportParameters變量中,但這並不意味着我必須在C#中獲得字符串化的JSON。

因此,而不是在與string.replace C#,我已經準備生成的JS代碼看起來像這樣:

var tempThing = { "Location" : "Billy's House" }; 
reportParameters = JSON.stringify(tempThing); 
StartDoingThings(); 

再次看它,我可以削減線路輸出的是,但它仍然作品。

TL; DR謝謝,我知道這是一個有點混亂的問題。

+2

JSON什麼你使用它無法處理撇號串行?嘗試Json.NET,我很確定它做的事情是正確的。 –

+0

@SamAxe它是Json.NET。將添加到帖子。 –

+0

看到這個問題:https://stackoverflow.com/questions/1242118/how-to-escape-json-string – frodo2975

回答

0

你混合語義。 C#和帶有雙引號的JavaScript使用反斜槓作爲C這樣的轉義字符,帶有單引號的javascript或者帶前綴的C#都是文字。

當您設置:

reportParameters = '{ "Location" : "Billy\'s House" }'; 

您使用的文字,所以被包含在字符串中的反斜槓。當你看到C#中的字符串時,你看到它被轉義了,因爲反斜槓是轉義字符,所以它被另一個反斜槓字符轉義,但這並不意味着有兩個反斜線,只有一個,但C#中的調試器向你顯示它它逃脫了形式。

如果你要正確地組合在JavaScript中使用的字符串這樣的:

reportParameters = "{ \"Location\" : \"Billy's House\" }"; 
+0

這樣:''我的轉義字符串'是一個完全合法的JavaScript字符串。 *文字*是什麼意思? –

+0

你的意思是[模板文字](https://開發者。mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)(這是ES6的一項功能)? –

+0

這是非常有啓發性的,並解釋了奇怪的字符串問題。 –

1

使用JSON。字符串化()將數據發送到服務器之前 //數據發送

var DTS = { "name": "someone's Name","phone": "123456" }; 
 
    $.ajax({ 
 
       type: "POST", 
 
       contentType: "application/json; charset=utf-8", 
 
       url: "ItemsAndCart.aspx/AddCustomer", 
 
       data: JSON.stringify(DTS), 
 
       datatype: "json", 
 
       success: function (result) { 
 
        alert(result.d); 
 
        console.log(result); 
 
       }, 
 
       error: function (xmlhttprequest, textstatus, errorthrown) { 
 
        alert(" conection to the server failed "); 
 
        console.log("error: " + errorthrown); 
 
       } 
 
      });

+0

代碼被編輯爲一個更好的例子 – Ali123

+0

是的,如果我不能更簡單的替換工作,這是我要嘗試的下一件事。我會立即嘗試 –

+0

是的,使用JSON.stringify確實解決了我被C#問題阻止的問題,非常感謝!我希望我能夠將不止一件事標記爲答案。 –