2011-07-05 43 views
54

Tại sao mã bên dưới gửi dữ liệu dưới dạng City=Moscow&Age=25 thay vì định dạng JSON?Gửi dữ liệu JSON bằng jQuery

var arr = {City:'Moscow', Age:25}; 
$.ajax(
    { 
     url: "Ajax.ashx", 
     type: "POST", 
     data: arr, 
     dataType: 'json', 
     async: false, 
     success: function(msg) { 
      alert(msg); 
     } 
    } 
); 
+2

kiểu dữ liệu là những gì được trả về, không phải nội dung được gửi! – Gal

+0

Hãy thử đặt 'dataType' trước dữ liệu ... không chắc chắn. – daGrevis

+1

Để ngăn không cho 'dữ liệu' được chuyển đổi sang định dạng chuỗi truy vấn được đặt' processData: false'. Xem http://api.jquery.com/jquery.ajax/#sending-data-to-server – Paul

Trả lời

142

Vì bạn chưa chỉ định không yêu cầu loại nội dung cũng như không sửa yêu cầu JSON. Dưới đây là cách chính xác để gửi yêu cầu JSON:

var arr = { City: 'Moscow', Age: 25 }; 
$.ajax({ 
    url: 'Ajax.ashx', 
    type: 'POST', 
    data: JSON.stringify(arr), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    async: false, 
    success: function(msg) { 
     alert(msg); 
    } 
}); 

Những điều cần chú ý:

  • Cách sử dụng của JSON.stringify phương pháp để chuyển đổi một đối tượng javascript vào một chuỗi JSON mà có nguồn gốc và được tích hợp vào trình duyệt hiện đại . Nếu bạn muốn hỗ trợ các trình duyệt cũ hơn, bạn có thể cần phải bao gồm json2.js
  • Xác định loại nội dung theo yêu cầu sử dụng contentType tài sản dùng để báo hiệu đến máy chủ mục đích của việc gửi một yêu cầu JSON
  • Thuộc tính dataType: 'json' được sử dụng cho các phản ứng loại bạn mong đợi từ máy chủ. jQuery đủ thông minh để đoán từ máy chủ Content-Type tiêu đề phản hồi. Vì vậy, nếu bạn có một máy chủ web mà tôn trọng nhiều hơn hoặc ít hơn các giao thức HTTP và đáp ứng với Content-Type: application/json theo yêu cầu của bạn, jQuery sẽ tự động phân tích cú pháp phản hồi thành một đối tượng javascript thành cuộc gọi success để bạn không cần phải chỉ định thuộc tính dataType.

Những điều cần cẩn thận về:

  • Những gì bạn gọi arrkhông phải là một mảng. Nó là một đối tượng javascript với các thuộc tính (CityAge). Mảng được biểu thị bằng [] trong javascript. Ví dụ: [{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }] là một mảng gồm 2 đối tượng.
+0

Xin chào Tôi đã thử nghiệm nó trong mã của tôi nhưng nó không hoạt động http://pastie.org/pastes/7975866/ văn bản tại sao? – Michelangelo

+0

Các đối tượng kỹ thuật trong JavaScript chỉ là mảng kết hợp. do đó, trong khi nó là khó hiểu để làm như vậy, gọi một đối tượng một mảng trong JavaScript không phải là một sai lầm. Để biết thêm thông tin, xem: [Cấu trúc dữ liệu JavaScript] (http://www.i-programmer.info/programming/javascript/1441-javascript-data-structures-the-associative-array.html) – Nadav

8

Bởi vì theo mặc định, jQuery nối tiếp các đối tượng được chuyển thành tham số data tới $.ajax. Nó sử dụng $.param để chuyển đổi dữ liệu thành chuỗi truy vấn.

Từ các tài liệu jQuery cho $.ajax:

[đối số data] được chuyển thành một chuỗi truy vấn, nếu chưa được một chuỗi

Nếu bạn muốn gửi JSON, bạn sẽ phải tự mã hóa:

data: JSON.stringify(arr); 

Lưu ý rằng JSON.stringify chỉ xuất hiện trong trình duyệt hiện đại. Để được hỗ trợ kế thừa, hãy xem xét json2.js

0

Nó được tuần tự hóa để URI có thể đọc cặp giá trị tên trong yêu cầu POST theo mặc định. Bạn có thể thử thiết lập processData: false thành danh sách các tham số của bạn. Không chắc chắn nếu điều đó sẽ giúp.

0

Bạn cần đặt đúng loại nội dung và chỉnh sửa đối tượng của mình.

var arr = {City:'Moscow', Age:25}; 
$.ajax(

      { 
       url: "Ajax.ashx", 
       type: "POST", 
       data: JSON.stringify(arr), 
       dataType: 'json', 
       async: false, 
       contentType: 'application/json; charset=utf-8', 
       success: function(msg) { 
        alert(msg); 
       } 
      } 
     ); 
+0

Điều này không hiệu quả ở tất cả. Không có biến được đăng. – Michelangelo

+0

@Michelangelo sau đó bạn đã làm điều đó không chính xác. –

3

Tôi đã viết một chức năng tiện lợi ngắn để đăng JSON.

$.postJSON = function(url, data, success, args) { 
    args = $.extend({ 
    url: url, 
    type: 'POST', 
    data: JSON.stringify(data), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    async: true, 
    success: success 
    }, args); 
    return $.ajax(args); 
}; 

$.postJSON('test/url', data, function(result) { 
    console.log('result', result); 
}); 
Các vấn đề liên quan