Làm cách nào để thoát chuỗi JSON để có chuỗi đó trong URL?


128

Sử dụng Javascript, tôi muốn tạo một liên kết đến một trang. Các tham số cho trang nằm trong một mảng Javascript mà tôi tuần tự hóa trong JSON.

Vì vậy, tôi muốn tạo một URL như thế:

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

Làm cách nào để thoát chuỗi JSON của tôi (mảng được tuần tự hóa) để đưa nó làm tham số trong URL?

Nếu có một giải pháp sử dụng JQuery, tôi sẽ thích nó.

Lưu ý: Có, các tham số cho trang cần phải nằm trong một mảng vì có rất nhiều trong số chúng. Tôi nghĩ rằng tôi sẽ sử dụng bit.ly để rút ngắn các liên kết sau đó.


Câu trả lời:


209
encodeURIComponent(JSON.stringify(object_to_be_serialised))

10
Dường như nó mã hóa nhiều ký tự hơn mức cần thiết (khi tôi dán liên kết vào Firefox, một số ký tự được hoàn nguyên (nghĩa là {["). Có cách nào để mã hóa các ký tự cần thiết để tôi có thể rút ngắn các url của mình không?
Matthieu Napoli

19

Bạn có thể sử dụng các encodeURIComponentphần mã hóa URL an toàn của chuỗi truy vấn:

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

hoặc nếu bạn đang gửi điều này dưới dạng yêu cầu AJAX:

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

19

Tôi đã tìm cách để làm điều tương tự. vấn đề với tôi là url của tôi đã đi quá lâu. Tôi đã tìm thấy một giải pháp ngày hôm nay bằng thư viện jsUrl.js của Bruno Jouhier .

Tôi chưa kiểm tra nó kỹ lưỡng lắm. Tuy nhiên, đây là một ví dụ hiển thị độ dài ký tự của đầu ra chuỗi sau khi mã hóa cùng một đối tượng lớn bằng 3 phương thức khác nhau:

  • 2651 ký tự sử dụng jQuery.param
  • 1691 ký tự sử dụng JSON.stringify + encodeURIComponent
  • 821 ký tự sử dụng JSURL.stringify

rõ ràng JSURL có định dạng được tối ưu hóa nhất cho urlEncoding một đối tượng js.

chuỗi tại https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q hiển thị điểm chuẩn để mã hóa và phân tích cú pháp.

Lưu ý : Sau khi thử nghiệm, có vẻ như thư viện jsurl.js sử dụng các hàm ECMAScript 5 như Object.keys, Array.map và Array.filter. Do đó, nó sẽ chỉ hoạt động trên các trình duyệt hiện đại (không có nghĩa là 8 trở xuống). Tuy nhiên, các polyfill cho các chức năng này sẽ làm cho nó tương thích với nhiều trình duyệt hơn.


Kể từ 0.1.4, nó cũng tương thích với IE 6-8 nếu bạn vẫn cần chúng.
Stoffe

8

Sử dụng encodeURIComponent():

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

5

Tôi sẽ cung cấp một sự thay thế lẻ bóng. Đôi khi, việc sử dụng mã hóa khác nhau sẽ dễ dàng hơn, đặc biệt nếu bạn đang xử lý nhiều hệ thống khác nhau mà không xử lý các chi tiết về mã hóa URL theo cùng một cách. Đây không phải là cách tiếp cận chủ đạo nhất nhưng có thể có ích trong một số tình huống.

Thay vì mã hóa URL dữ liệu, bạn có thể mã hóa 64 dữ liệu. Lợi ích của việc này là dữ liệu được mã hóa rất chung chung, chỉ bao gồm các ký tự alpha và đôi khi là dấu =. Thí dụ:

Chuỗi mảng JSON:

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

Dữ liệu đó, được mã hóa URL dưới dạng dataparam:

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

Tương tự, mã hóa base64:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

Cách tiếp cận base64 có thể ngắn hơn một chút, nhưng quan trọng hơn là nó đơn giản hơn. Tôi thường gặp vấn đề khi di chuyển dữ liệu được mã hóa URL giữa cURL, trình duyệt web và các máy khách khác, thường là do dấu ngoặc kép, %dấu hiệu nhúng , v.v. Base64 rất trung tính vì nó không sử dụng các ký tự đặc biệt.


cuối cùng đã tìm thấy địa chỉ (% 26) của bạn tôi (&) tại đây
Pradeep Kumar Mitchaharan

vấn đề với chuỗi base64 là chúng có thể chứa ký tự gạch chéo (/), điều này sẽ làm mất hiệu lực url ...
ingbabic

Đó là sự thật nhưng bạn có thể chọn nhân vật để sử dụng trong base64: thay thế /với $, _hoặc bất kỳ ký tự khác mà không đòi hỏi mã hóa url mỗi RFC 3986.
Chris Johnson

0

Câu trả lời được đưa ra bởi Delan là hoàn hảo. Chỉ cần thêm vào nó - trong trường hợp ai đó muốn đặt tên cho các tham số hoặc truyền riêng nhiều chuỗi JSON - đoạn mã dưới đây có thể giúp ích!

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')));

Hi vọng điêu nay co ich!


Không cần dữ liệu urldecode () có trong PHP $ _POST hoặc bất kỳ dữ liệu nào khác (GET, REQEST, v.v.). Tùy thuộc vào những gì bạn làm từ đây trở đi, bạn có thể sẽ tự giải quyết vấn đề bảo mật (SQL SQL, v.v.)
Tit Petric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.