由json字串生成json物件時的轉義問題

由json字串生成json物件時的轉義問題

這個問題的核心就是解析字串時會有兩次轉義。

—————————————————
轉義字元(\)對JavaScript中JSON.parse的影響概述

JSON是一個提供了stringify和parse方法的內建物件,前者用於將js物件轉化為符合json標準的字串,後者將符合json標準的字串轉化為js物件,本文為大家介紹下轉義字元對JSON.parse方法的影響。

按照ECMA262第五版中的解釋,JSON是一個提供了stringify和parse方法的內建物件,前者用於將js物件轉化為符合json標準的字串,後者將符合json標準的字串轉化為js物件。json標準參考<a href=”http://json.org/” target=”_blank”>json.org</a>。(其實將符合json標準的字串轉化為js物件可以用eval,但是eval效能相對差且存在安全隱患(會執行json字串中的程式碼),本文寫的是轉義字元對JSON.parse方法的影響。 

一般來說在JSON.parse的引數包含轉移字元的時候會遇到兩次轉義的問題,其實第一次是字串本身的轉義,第二次是將真正轉為js物件的轉義。 

舉例如下: 
例子一:將字串'{“a”:”b”,”b”:”\\\\”}’傳遞給JSON.parse,首先解析器提取單引號括起來的字串時認為第一個\轉義第二個\ 第三個\轉義第四個\,也就是說實際可輸出字串是{“a”:”b”,”b”:”\\”}(可通過console.log(‘{“a”:”b”,”b”:”\\\\”}’)驗證),之後正式轉為js物件的時候還有一次轉義,也就是實際輸出字元轉中的第一個\轉義第二個\(此時只有兩個\)。所以console.log(JSON.parse(‘{“a”:”b”,”b”:”\\\\”}’)
);輸出結果為Object {a: “b”, b: “\”},也就是說實際顯示的資料為一個\(實際可輸出一個\說明在此之前還有一個\)。 
例子二: 
var obj = { 
a : “b”, 
b : “\\”, 
c : { 
b : “\\”, 
a : { 
b : “\\” 


}; 
var json_str = JSON.stringify(obj); 
console.log( JSON.stringify(obj) ); 
console.dir(JSON.parse(json_str)); 
console.dir(JSON.parse(‘{“a”:”b”,”b”:”\\\\”,”c”:{“b”:”\\\\”,”a”:{“b”:”\\\\”}}}’));輸出結果如下圖 
pic 
根據轉義規則,實際輸出一個\在這個\之前必定有一個\。所以如上第一行輸出按照書寫來說為'{“a”:”b”,”b”:”\\\\”,”c”:{“b”:”\\\\”,”a”:{“b”:”\\\\”}}}’,可通過第三條輸出來驗證。 
總結,如果想在js物件中出現一個\,需要在json字串中出現四個\ 。 

對於其他的其他的特殊字元 
1.雙引號(”),如果正確出現雙引號應為\\\” 
2.\n,如想想出現正確的換行需要json字串中是\\n,其實是先對\n中的\轉義,n變成了普通字元,在解析為js物件的時候n與之前的\(只有一個\了)被解釋為換行。如下的兩個與此類似。 
3.\r,\\r 
4.\t,\\t 

———————————————————————————————————————————————————————————————

特殊字元導致json字串轉換成json物件出錯

在對資料庫取出來的資料(特別是描述資訊)裡面含有特殊字元的話,使用JSON.parse將json字串轉換成json物件的時候會出錯,主要是雙引號,回車換行等影響明顯,左尖括號和右尖括號也會導致顯示問題,所以要在輸出到頁面進行json物件轉換之前將一些特殊符合進行編碼或轉義,下面展示的是C#程式碼編碼和轉義幾個常用特殊字元。經過筆者測試,將這些符號編碼和轉義之後,大部分json字串都可以轉換成json物件了。如果遇到個別問題,應朝著這個方向去查詢問題。

[csharp] view
plain
copy在CODE上檢視程式碼片派生到我的程式碼片

  1.             theString = theString.Replace(“>”, “&gt;”);  
  2.             theString = theString.Replace(“<“, “&lt;”);  
  3.             theString = theString.Replace(” “, “&nbsp;”);  
  4.             theString = theString.Replace(“\””, “&quot;”);  
  5.             theString = theString.Replace(“\'”, “'”);  
  6.             theString = theString.Replace(“\\”, “\\\\”);//對斜線的轉義  
  7.             theString = theString.Replace(“\n”, “\\n”);
     //注意php中替換的時候只能用雙引號”\n”
  8.             theString = theString.Replace(“\r”, “\\r”);  

注意:\r是回到行首,\n是新啟一行,這兩個一般同時出現,應該同時處理。

補充:文字中間的換行,空格在資料庫裡面不以\r\n,&nbsp;;等形式顯示出來(“本書”與“前80”之間換行,“由”與“曹雪芹”之間空格)

文字:

資料庫:

原文出處:http://blog.csdn.net/dotNET25/article/details/24475437

——————————————-下面這個和上面文章類似,替換的字元不一樣,那個比較好還不知道。。—————-

java 中JSON資料特殊字元的處理

JSon 資料中的String 傳遞資料時,需要處理好特殊字元 
1 :引號   如果是使用單引號,來括值的話,那String 中  ‘  單引號為特殊字元 
2:正斜槓,反斜槓,換行符號等。另外,必須
(“) 而非 (‘) 表示字串: 

Java程式碼  收藏程式碼
  1. static StringBuffer string2Json(String s) {       
  2.     StringBuffer sb = new StringBuffer ();       
  3.     for (int i=0; i<s.length(); i ) {       
  4.      
  5.         char c = s.charAt(i);       
  6.         switch (c) {       
  7.         case ‘\”‘:       
  8.             sb.append(“\\\””);       
  9.             break;       
  10.         case ‘\\’:       
  11.             sb.append(“\\\\”);       
  12.             break;       
  13.         case ‘/’:       
  14.             sb.append(“\\/”);       
  15.             break;       
  16.         case ‘\b’:       
  17.             sb.append(“\\b”);       
  18.             break;       
  19.         case ‘\f’:       
  20.             sb.append(“\\f”);       
  21.             break;       
  22.         case ‘\n’:       
  23.             sb.append(“\\n”);       
  24.             break;       
  25.         case ‘\r’:       
  26.             sb.append(“\\r”);       
  27.             break;       
  28.         case ‘\t’:       
  29.             sb.append(“\\t”);       
  30.             break;       
  31.         default:       
  32.             sb.append(c);       
  33.     }  
  34.     return sb.toString();       
  35.  }    

文章出處:http://yancc.iteye.com/blog/983918

————————————————————————————————————————————————————–

Java到JSON特殊字元轉換

由於從伺服器後端生成JSON格式的字串,最後傳遞到客戶端由 eval() 函式動態的生成Javascript,如果JSON字串格式錯誤,則eval解析會出錯,經常也是最常出錯的是 ” ‘ \r\n  這三個字元,如 {name:’I’am’}解析時會出錯,同樣,由於JavaScript中的字串可由單引號也可由雙引號引起來,所以雙引號一樣也有這樣問題。另外,字串是不能跨行寫的,即你不能寫成這樣:{name:”I’

am”}

所以這3個需要轉換,另外換行可能依賴於平臺,所以 \n 也需要轉換,比如我們需要將後臺丟擲的異常棧資訊以JSON的格式傳回到瀏覽器上顯示時,就需要將回車換行轉換。程式碼如下:

 

Java程式碼  收藏程式碼
  1. response.setContentType(“application/json”);  
  2.   
  3. Writer wr = response.getWriter();  
  4.   
  5. if(exceptionTrace.indexOf(“‘”)!=-1){  
  6.     //將單引號轉義一下,因為JSON串中的字串型別可以單引號引起來的  
  7.     exceptionTrace = exceptionTrace.replaceAll(“‘”, “\\'”);  
  8. }  
  9. if(exceptionTrace.indexOf(“\””)!=-1){  
  10.     //將雙引號轉義一下,因為JSON串中的字串型別可以單引號引起來的  
  11.     exceptionTrace = exceptionTrace.replaceAll(“\””, “\\\””);  
  12. }  
  13.   
  14. if(exceptionTrace.indexOf(“\r\n”)!=-1){  
  15.     //將回車換行轉換一下,因為JSON串中字串不能出現顯式的回車換行  
  16.     exceptionTrace = exceptionTrace.replaceAll(“\r\n”, “\\u000d\\u000a”);  
  17. }  
  18. if(exceptionTrace.indexOf(“\n”)!=-1){  
  19.     //將換行轉換一下,因為JSON串中字串不能出現顯式的換行  
  20.     exceptionTrace = exceptionTrace.replaceAll(“\n”, “\\u000a”);  
  21. }  
  22.   
  23. wr.write(“{success:false,exception:true,msg:'”  exceptionTrace   “‘}”);  
  24. wr.flush();  
  25. wr.close();