2013-07-02 20 views
6

Tôi đang sử dụng PHP json_encode() trở lại một số dữ liệu, lấy ra bởi ajax() jQuery:json_encode tạo JSON bị thay đổi (với nhân vật ẩn phụ)

Giản JS:

$.ajax({ 
    dataType: 'json', 
    contentType: 'application/json', 
    cache: false, 
    type: 'POST', 
    url: './api/_imgdown.php', 
    error: function(jqXHR, textStatus, errorThrow) { 
     console.log(jqXHR, textStatus, errorThrow); 
    }, 
    success: function(data, textStatus, jqXHR) { 
     console.log(data, textStatus, jqXHR); 
    } 
}); 

Các PHP là:

header('Content-Type: application/json; charset=UTF-8'); 
//default apiResponse 
$apiResponse = [ 
    "status" => 1, 
    "message" => "success", 
    "data" => null 
]; 

Sau đó, khi php chạy mã của tôi, nó kết thúc bằng cách thêm dữ liệu này:

$apiResponse['data'][] = [ 
    "mid" => (int)$mid, 
    "card_type" => $card_type, 
    "header_size" => (int)$headers['Content-Length'], 
    "saved_size" => (int)filesize($imgSavePath), 
    "saved_path" => $imgSavePath 
]; 
//spit out the JSON 
echo json_encode($apiResponse); 
exit(); 

Các JSON:

{"status":1,"message":"success","data":[{"mid":340052,"card_type":"kakusei","header_size":48337,"saved_size":48337,"saved_path":"..\/card\/kakusei\/340052.png"}]} 

Lúc đầu có vẻ như hợp lệ. Ajax của tôi truy xuất PHP này luôn kết thúc bằng parseerror (do đó đi vào phần error của ajax()).

Nếu bạn sao chép và dán JSON này trên http://jsonlint.com/, thông báo cho biết "Mã thông báo không mong muốn" và http://jsonformatter.curiousconcept.com/ nói là không hợp lệ.

Tôi đã thử echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES); mặc dù thoát dấu gạch chéo là ok \/ nhưng không có sự khác biệt.

Nhưng những gì không chính xác hợp lệ? Chẳng phải PHP phải trả lại JSON hợp lệ sao?

thông tin thêm: Kiểm tra trên Windows7, Chrome v28.XX, sử dụng PHP 5.4.XX trên Apache

Câu hỏi Tôi đã đọc trước khi thực sự đăng này một:


Cập nhật:

sao chép từ SO vào JSONlint cho json hợp lệ. Vì vậy, tôi điều tra thêm một chút và nhận thấy PHP đang tạo ra một nhân vật ẩn kỳ lạ mà thực sự làm cho json không hợp lệ. Xem ảnh chụp màn hình bên dưới. Tôi khắc phục điều đó như thế nào? json invalid character

+0

JSONLint cho thấy nó là tốt. –

+0

json của bạn hợp lệ và php của bạn hợp lệ. Tôi đoán đó là cuộc gọi ajax của bạn. Hãy thử sử dụng '$ .getJSON' một cuộc gọi ajax đơn giản hơn để yêu cầu json – sircapsalot

+0

Hiển thị của nó hợp lệ trên jsonlint. –

Trả lời

8

Có thể là sự cố với dấu BOM. Hãy thử lưu tệp như bình thường UTF-8 để thay thế.

+1

Vâng, như bạn đã giúp tìm ra, là BOM char '65279'. Tôi đã tìm thấy một câu hỏi khác với vấn đề này http://stackoverflow.com/questions/6538203/how-to-avoid-echoing-character-65279-in-php-this-question-also-relates-to-java Vấn đề là tôi cần BOM vì 'card_type' có thể có các ký tự latin chẳng hạn như' áe' không được mã hóa thành các thực thể HTML, do đó sẽ bị lỗi khi được lưu mà không có 'BOM'. Tôi sẽ lưu như UTF-8 bình thường và thử sử dụng 'htmlentities()' cho điều đó và hy vọng sẽ hoạt động. Cảm ơn bạn đã trả lời thời gian! – RaphaelDDL

+3

Ôi Chúa ơi. Đã tìm kiếm câu trả lời cho vấn đề này trong hai ngày nay ... Cảm ơn! :-) –

-1

Tôi đã gặp phải sự cố tương tự, nhưng tôi không thể tìm thấy tệp nào trên Windows của mình được lưu trong UTF8 bằng BOM (Mặc dù tôi đã cố gắng tìm kiếm tệp nhiều nhất có thể).

Tuy nhiên, tôi đã tìm ra giải pháp thay thế. Giả sử ở phía máy chủ tôi có

die(json_encode(array(
    'OK' => 1 
))) 
  1. Trên $.ajax cuộc gọi, tôi loại bỏ các entry "datatype: 'json" và tôi truy cập vào các phản ứng với những dòng sau:
success: function (response) { 
     var data = $.parseJSON(response); 
     console.log(data.OK); // = 1 
    } 
  1. Trên $ gọi ajax, tôi vẫn giữ mục "datatype: 'json", sau đó tôi phải truy cập vào giá trị bên trong phản ứng như

var dataOK = phản ứng này [ 'OK']; // = 1

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