2009-04-06 63 views
15

Tôi nhận được lỗi phân tích cú pháp khi sử dụng jQuery để tải một số dữ liệu JSON. Đây là một đoạn mã của tôi:jQuery.ajax() + đối tượng JSON trống = lỗi phân tích cú pháp

jQuery.ajax({ 
    dataType: "json", 

    success: function (json) 
    { 
     jQuery.each(json, function() 
     { 
      alert(this["columnName"]); 
     }); 
    } 
}); 

Tôi không gặp lỗi khi phân tích cú pháp đối tượng JSON không trống. Vì vậy, tôi đoán là vấn đề là với serializer của tôi.


Câu hỏi là: làm thế nào để định dạng một đối tượng JSON trống mà jQuery sẽ không xem xét bị thay đổi?

Đây là những gì tôi đã cố gắng cho đến nay, không có thành công:

{[]} 

{[null]} 

{} 

{null} 


{"rows": []} 

{"rows": null} 

{"rows": {}} 



UPDATE:

tôi có thể hiểu rằng tôi đã hơi mơ hồ - hãy tôi thử và làm rõ:

Phân tích cú pháp đối tượng JSON không phải là vấn đề ở đây - JQuery là - tôi nghĩ vậy.

jQuery ném lỗi phân tích cú pháp (gọi hàm lỗi). Có vẻ như xác thực JSON nội bộ của jQuery không chấp nhận bất kỳ đối tượng nào được đề cập trước đây. Không, ngay cả những cái hợp lệ.

Output của hàm lỗi là:

XMLHttpRequest: XMLHttpRequest readyState=4 status=200
textStatus: parsererror
errorThrown: undefined

này áp dụng cho tất cả các đối tượng trước khi đề cập đến.

+0

Đó là vấn đề với các tập con, họ sẽ không bao không có tất cả. –

+0

tất cả nhưng bạn là ví dụ thứ 3 không phải là JSON hợp lệ, vì không có khóa nào trong từ điển – cobbal

+0

Được cập nhật thêm một vài lần thử. Vẫn nhận được lỗi phân tích cú pháp. – roosteronacid

Trả lời

1

Thay vì:

$(json).each(function() { ... }); 

Tôi nghĩ rằng bạn muốn được sử dụng:

$.each(json, function() { ... }); 

Từ jQuery.each documentation:

This function is not the same as $().each() - which is used to iterate, exclusively, over a jQuery object. This function can be used to iterate over anything.

+0

Loại'o.Nhưng cảm ơn - đã chỉnh sửa và lưu. Không thực sự là một câu trả lời mặc dù. – roosteronacid

1

Bạn có xác minh nếu JSON được trả lại một cách chính xác trong nơi đầu tiên trước mỗi người? Đặt giá trị trống là {} và xác minh xem giá trị đó có giống như trước đó hay không .each

Ngoài ra, nó sẽ giúp biết JSON của bạn trông như thế nào khi có dữ liệu.

2

bạn đang tìm kiếm này:

[] 

một mảng trống. Tức là, nếu bạn có kế hoạch lặp lại nó ngay lập tức, thì những gì bạn cần là một mảng.

5

Trước hết là {[]}, {[null]}{null} sẽ không hoạt động vì tất cả các đối tượng JSON không hợp lệ (như được xác minh bởi JSON validator).

Các đối tượng còn lại là tất cả các đối tượng JSON hợp lệ, do đó, hàm success của bạn sẽ được yêu cầu.

Nếu bạn chuyển đối tượng đối tượng không phải mảng hoặc mảng, thì hàm each sẽ liệt kê đối tượng json của bạn bằng thuộc tính được đặt tên của nó. Trong trường hợp ba đối tượng của bạn có mỗi thuộc tính rowsthis sẽ được đặt thành [], null{} tương ứng, không có thuộc tính nào có thuộc tính columnName do đó, lỗi không xác định sẽ được ném.

Mặt khác, đối tượng {} của bạn không có thuộc tính, do đó không được gây ra lỗi vì cuộc gọi each sẽ lặp 0 lần. Dòng sau hiển thị như thế nào nếu bạn thêm dòng đó làm dòng đầu tiên trong hàm success của mình?

alert(typeof json + ' ' + (json == null)); 
2

Dịch vụ web của bạn có thể trả về giá trị rỗng. Tôi đã tìm thấy rằng trả về null từ một cuộc gọi dịch vụ web trả về một phản hồi với mã trạng thái 200, "Ok", nhưng jQuery ném một parseerror sau đó.

Nếu trường hợp này xảy ra, nó không liên quan gì đến những gì bạn đang gửi tới máy chủ và mọi thứ với máy chủ gửi lại.

Nếu bạn có thể thay đổi dịch vụ web, bạn có thể muốn thử trả về một đối tượng JSON trống hoặc giá trị mặc định thay cho Null. Ngoài ra, bạn có thể kiểm tra kịch bản lỗi này trong trình xử lý lỗi của bạn, biết rằng điều này có nghĩa là cuộc gọi của bạn trả về null.

0

Tôi đã gặp sự cố tương tự khi yêu cầu JSON hợp lệ từ máy chủ.

máy chủ của tôi đã phục vụ nội dung loại text/javascript

tôi đã không sử dụng các thiết lập tùy chọn của jQuery.ajax 'datatype' để jQuery được interpretting đầu ra một javascript (ví dụ đệm JSON), không gọn gàng JSON.

Thêm kiểu dữ liệu: 'JSON' vào đối tượng cài đặt được chuyển đến phương thức ajax của jQuery đã giải quyết được sự cố.

0

Đã xảy ra sự cố này và giải quyết vấn đề bằng cách sử dụng trình gỡ rối jsonserializer trong dịch vụ web của tôi để định dạng chuỗi rỗng. kết quả là "\" \ "" về cơ bản "";

9

Giải pháp là để trả lại một mã trạng thái của 204 chứ không phải 200 từ máy chủ, 204 là "không có nội dung" và nó sẽ trở thành công khi không cố gắng để gọi phân tích cú pháp

Các vấn đề liên quan