2011-07-24 27 views
103

使用Javascript,我想要生成一個頁面的鏈接。該頁面的參數位於我用JSON序列化的Javascript數組中。如何轉義JSON字符串以將其放入URL中?

所以我想產生這樣一個URL:

http://example.com/?data="MY_JSON_ARRAY_HERE" 

如何,我需要逃避我JSON字符串(數組序列化),將它作爲一個URL參數?

如果有使用JQuery的解決方案,我會喜歡它。

注意:是的,頁面的參數需要在一個數組中,因爲它們中有很多。我想我會使用bit.ly來縮短鏈接。

+0

另請參見http://stackoverflow.com/questions/21802866/how-to-compress-url-parameters – w00t

回答

174
encodeURIComponent(JSON.stringify(object_to_be_serialised)) 
+5

它似乎雖然編碼更多的字符比必要的(當我粘貼在Firefox的鏈接,一些字符被還原我們可以縮短我的網址嗎? –

5

使用encodeURIComponent()

var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})), 
17

你可以使用一個查詢字符串的encodeURIComponent安全URL編碼部分:

var array = JSON.stringify([ 'foo', 'bar' ]); 
var url = 'http://example.com/?data=' + encodeURIComponent(array); 

,或者如果您發送此作爲一個AJAX請求:

var array = JSON.stringify([ 'foo', 'bar' ]); 
$.ajax({ 
    url: 'http://example.com/', 
    type: 'GET', 
    data: { data: array }, 
    success: function(result) { 
     // process the results 
    } 
}); 
0

德蘭給出的答案是完美的。只需添加到它 - 因爲有人想要命名參數或分別傳遞多個JSON字符串 - 下面的代碼可以幫助!

JQuery的

var valuesToPass = new Array(encodeURIComponent(VALUE_1), encodeURIComponent(VALUE_2), encodeURIComponent(VALUE_3), encodeURIComponent(VALUE_4)); 

data = {elements:JSON.stringify(valuesToPass)} 

PHP

json_decode(urldecode($_POST('elements'))); 

希望這有助於!

+0

沒有必要使用PHP $ _POST或任何其他的(GET, REQEST等),根據你從這裏開始做什麼,你可能會因爲安全問題而打開自己(SQL注入等) –

13

我期待着做同樣的事情。問題是我的網址變得太長了。我今天使用Bruno Jouhier's jsUrl.js library找到了一個解決方案。

我還沒有完全測試它。然而,這裏是表示字符串輸出的字符長度編碼相同大使用3種不同的方法對象之後的示例:

  • 2651字符使用jQuery.param
  • 1691字符使用JSON.stringify + encodeURIComponent
  • 821字符使用JSURL.stringify

很明顯,JSURL爲urlEncoding一個js對象提供了最優化的格式。

線程https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q 顯示編碼和解析的基準。

注意:測試後,它看起來像jsurl.js庫使用ECMAScript 5函數,如Object.keys,Array.map和Array.filter。因此,它只適用於現代瀏覽器(不支持8和以下)。但是,這些功能的填充會使其與更多瀏覽器兼容。

+0

由於0.1.4,如果你仍然需要這些,它也與IE6-8兼容。 – Stoffe

2

我會提供了一個古怪的選擇。有時使用不同的編碼會更容易,尤其是在處理各種系統時,並不都以相同的方式處理URL編碼的細節。這不是最主流的方法,但可以在某些情況下派上用場。

而不是URL編碼數據,您可以base64編碼它。這樣做的好處是編碼數據非常通用,只包含字母字符,有時候會跟蹤='s。例如:

JSON陣列的串:

["option", "Fred's dog", "Bill & Trudy", "param=3"] 

即數據,URL編碼作爲data PARAM:

"data=%5B%27option%27%2C+%22Fred%27s+dog%22%2C+%27Bill+%26+Trudy%27%2C+%27param%3D3%27%5D" 

同樣,base64編碼:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd" 

base64方法可以稍微短一些,但更重要的是它更簡單。在cURL,Web瀏覽器和其他客戶端之間移動URL編碼數據常常會遇到問題,通常是由於引號,嵌入標記等。 Base64非常中性,因爲它不使用特殊字符。