2013-07-29 31 views
21

Tôi đã tìm kiếm và đọc hầu hết các chủ đề liên quan, nhưng chúng không phải là những gì tôi đang tìm kiếm.php json_encode & jquery parseJSON vấn đề đơn lẻ

Tôi đã một JSON chuỗi enocded với chức năng json_encode PHP:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987} 

Tôi đang làm việc với jQuery để đưa các giá trị trong trường thích hợp cũng vậy, trong trường hợp thử nghiệm tôi đã làm dưới đây:

<script> 
var obj = jQuery.parseJSON('<?=$data?>'); 
console.log(obj); 
</script> 

Giả sử rằng $ data là thế này:

$data = 
<<<END 
{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987} 
END; 

gì Google chrome c onsole sản xuất trong trường hợp này:

Uncaught SyntaxError: Unexpected identifier 

Tuy nhiên khi tôi thực hiện một sự thay đổi trong JSON chuỗi mã hóa - thêm Dấu gạch chéo ngược để trích dẫn duy nhất:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D\'Onofrio"],"year":1987} 

điều khiển đầu ra là như bình thường:

Object {casts: Array[3], year: 1987} 
casts: Array[3] 
year: 1987 

Câu hỏi: có phải lỗi này trong bảng điều khiển được mong đợi không? Tôi nghĩ rằng thoát hoặc thay thế ' bằng \' sẽ rất bẩn!

CẬP NHẬT

Trên thực tế $ data giá trị xuất phát từ một var json_encode($var) và $ là một mảng!

$data = json_encode($var); 

Trả lời

13

Tuy nhiên khi tôi thực hiện một sự thay đổi trong JSON chuỗi mã hóa - thêm dấu chéo ngược để dấu nháy đơn

Đó thoát nó trong chuỗi PHP chữ. Sau đó nó được chèn vào chuỗi PHP như là một đơn giản '.

Nếu bạn muốn thoát khỏi nó trước khi chèn nó vào JavaScript thì bạn cần phải thêm dấu gạch chéo vào chuỗi bạn nhận được ra của json_encode (hoặc đúng hơn, vì bạn không sử dụng nó (bạn nên!) chuỗi bạn xây dựng bằng tay).

Đó là công việc nhiều hơn thì bạn cần. Các giải pháp thực sự là để nhớ rằng JSON là một tập hợp con của cú pháp JavaScript đen:

var obj = <?=$data?>; 
+0

chuỗi json không được xây dựng bằng tay. xem cập nhật xin vui lòng. – revo

+7

+1 không cần phân tích cú pháp - đầu ra của 'json_encode' đã là JavaScript hợp lệ. – cmbuckley

+0

Sẽ tốt nếu chỉ định 'JSON_HEX_TAG | JSON_HEX_AMP'. Ít nhất là trước đây có thể cần thiết để đáp ứng [các hạn chế đối với nội dung của các phần tử 'script'] (http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#restrictions -for-contents-of-script-elements) và cả hai đều cần thiết nếu tài liệu có thể được phân tích cú pháp dưới dạng XML. – PleaseStand

4

các vấn đề mà bạn đang phải đối mặt là bạn đang trình bày các kết quả của các cuộc gọi json_encode để javascript như là một chuỗi trong khi nó là bằng javascript hợp lệ . Loại bỏ tập tin jQuery.jsonParse ra khỏi đầu ra và chỉ cần gán các kết quả được lặp lại cho biến javascript đang được đề cập đến.

var obj = <?= json_encode(array("casts"=>array("Matthew Modine","Adam Baldwin","Vincent D'Onofrio"),"year"=>1987)); ?>; 
+0

hãy xem cập nhật của tôi. – revo

+0

Mã ở trên sẽ hoạt động cho bạn ... nó cũng hiển thị bằng cách chuyển bước javascript parseJson. – Orangepill

53

Đối với các vấn đề rộng hơn về đi qua một chuỗi JSON-mã hóa trong PHP (ví dụ, thông qua cURL), sử dụng tùy chọn JSON_HEX_APOS là cách sạch nhất để giải quyết vấn đề này.Điều này sẽ giải quyết vấn đề của bạn là tốt, mặc dù các câu trả lời trước đó là chính xác rằng bạn không cần để gọi parseJSON và đối tượng JavaScript giống nhau mà không cần gọi parseJSON trên $data.

Đối với mã của bạn, bạn sẽ chỉ làm cho sự thay đổi này:

json_encode($var)-json_encode($var, JSON_HEX_APOS).

Dưới đây là một ví dụ về các dữ liệu được mã hóa một cách chính xác đang được phân tích bởi jQuery: http://jsfiddle.net/SuttX/

Để đọc thêm, đây là một ví dụ từ PHP.net json_encode manual entry Ví dụ # 2:

$a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9"); 

echo "Apos: ", json_encode($a, JSON_HEX_APOS), "\n"; 

chí đầu ra này:

Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"] 

Có thể tìm thấy danh sách đầy đủ các hằng số JSON tại đây: PHP.net JSON constants

+7

Cảm ơn bạn! Giải pháp này hoạt động rất tốt cho tôi! –

+6

Giải pháp tuyệt vời và đơn giản! Đã cứu mạng tôi 2 năm sau đó. Cảm ơn!! –

+1

Giải pháp này vẫn giữ được 5 năm. Bạn đã tiết kiệm cho tôi thời gian lớn – bmatovu