2011-06-28 38 views
6

Tôi đang sử dụng WordPress cùng với Plugin API JSON (http://wordpress.org/extend/plugins/json-api/) để tạo câu trả lời cho trang web khác của chúng tôi.Mã hóa JSON lạ sử dụng json_encode

Tôi đã trúng một vấn đề thực sự kỳ lạ (chúng tôi đang sử dụng PHP 5.3.6), khi tôi vượt qua các mảng sau http://pastebin.com/xdfYjrvK để json_encode() nó mang lại cho tôi điều này (với json content-type): http://pastebin.com/T61XGPP5

Vì vậy, các crap trong đầu, trong ví dụ trên nó là 2609 và 0 cuối cùng, nó thay đổi tùy thuộc vào kích thước của phản ứng, nội dung hơn -> số hex cao hơn. Nó cũng chỉ xuất hiện khi số lượng phản hồi là "đủ cao", do đó, nó hoạt động trên các phản hồi nhỏ. Đầu tiên tôi nghĩ nó là plugin, nhưng nó hoạt động cục bộ (trên hai máy Mac OS X khác nhau) và chúng tôi đã cập nhật tất cả các gói trên VPS (Debian, Apache, Nginx, PHP) lên phiên bản mới nhất.

Nó chỉ hiển thị khi gửi content-type, không phải khi xuất ra kết quả $ với văn bản đơn giản thay vì application/json:

$charset = get_option('blog_charset'); 
if (!headers_sent()) { 
    header('HTTP/1.1 200 OK', true); 
    header("Content-Type: application/json; charset=$charset", true); 
} 

echo $result; 

$ charset được thiết lập để utf-8.

Bảng điều khiển chrome của Google cho biết: "Tài nguyên được hiểu là Tài liệu nhưng được chuyển với ứng dụng loại/json MIME".

Vì vậy, có ai có manh mối gì đang xảy ra ở đây không?

+0

$ result được khởi tạo ở đâu? Đây có phải là giá trị json_encode-d không? –

+0

Có, nó xuất phát từ một chức năng khác sẽ xử lý json_encoding kèm theo. –

Trả lời

4

này trông mã hóa chunked như (http://en.wikipedia.org/wiki/Chunked_transfer_encoding). Đảm bảo kiểm tra xem các tiêu đề của bạn có đang đặt Độ dài nội dung đúng cách trong phản hồi để đảm bảo bạn không buộc máy chủ web sử dụng CTE hay không.

+0

Tiêu đề của tôi là: HTTP/1.1 200 OK Máy chủ: nginx/0.6.32 Ngày: Thứ tư, 29 tháng 6 năm 2011 06:25:53 GMT Loại nội dung: application/json; charset = UTF-8 Chuyển mã hóa: chunked Kết nối: giữ sống X-Powered-By: PHP/5.2.6-1 + lenny10 Đặt chiều dài nội dung hoạt động như một nét duyên dáng, cảm ơn! –

+0

có cùng một vấn đề, với nginx aswell .. cảm ơn rất nhiều điều này đã cứu tôi rất nhiều rắc rối – skiplecariboo

0

Một yêu cầu json có là tất cả dữ liệu bạn cung cấp cho nó phải được mã hóa UTF-8. json_encode() không thực hiện điều này một cách tự động. Vì vậy, bạn có thể thử để chạy này array_map("utf8_encode", $array); trước khi bạn json_encode nó.

khác ... Có vẻ kỳ lạ, vì vậy Im chỉ đoán ...

+0

Tất cả dữ liệu đã được mã hóa utf-8 –

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