2011-09-18 45 views
19

Tôi đang tạo chuỗi JSON từ một mảng PHP. Tôi đã mã hóa nó bằng cách sử dụng json_encode().Chuỗi JSON PHP, thoát Dấu ngoặc kép cho đầu ra JS

$data = array(
    'title' => 'Example string\'s with "special" characters' 
); 

$data = json_encode($data); 

$data được cục bộ sử dụng wp_localize_script() và có thể truy cập thông qua một data biến toàn cầu.

Trong tập tin JS Tôi có thể truy cập thông tin bằng cách như sau:

var data  = data.replace(/"/g, '"'), 
    jsonData = jQuery.parseJSON(data); 

console.log(jsonData); 

Điều này dẫn đến công suất:

{ "title":"Example string's with "special" characters" } 

Ra, vào mà kết quả vào http://jsonlint.com/ trả về một lỗi. Loại bỏ các dấu ngoặc kép xung quanh "đặc biệt" xác nhận chuỗi.

Cách tốt nhất để tạo chuỗi JSON từ PHP và thoát đúng cách để sử dụng trong tệp JS là gì?

Trả lời

8

Từ http://www.php.net/manual/en/function.json-encode.php#100565

Điều đó nói rằng, trích dẫn "sẽ sản xuất không hợp lệ JSON, nhưng đây chỉ là một vấn đề nếu bạn đang sử dụng json_encode() và chỉ mong đợi PHP để kỳ diệu thoát khỏi dấu ngoặc kép của bạn. Bạn cần phải làm . sự thoát mình

+30

Vì vậy, bạn không thể mong đợi json_encode tạo ra một json hợp lệ? Tôi sẽ không thuê nhà phát triển này –

+7

@Joti Bạn phải là người mới đối với PHP, sau đó: P –

+5

câu trả lời này, mặc dù được đánh dấu là được chấp nhận, không trả lời câu hỏi. OP hỏi: cách tốt nhất để tạo chuỗi JSON từ PHP là gì và thoát đúng cách để sử dụng trong tệp JS?Câu trả lời này nói rằng bạn cần tự mình thoát ra nhưng không cung cấp cách tốt nhất để làm điều này. – Alex

18

Một cách khác sẽ được mã hóa có dấu ngoặc kép sử dụng htmlspecialchars:

$json_array = array(
    'title' => 'Example string\'s with "special" characters' 
); 

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8'); 
+11

Sẽ không chuyển đổi '" 'thành' " '? – colllin

+1

không hoạt động với m – WonderLand

+0

Mẹo hay, nó hoạt động tốt với thuộc tính' data-'(html5) :) Cảm ơn! +1 –

13

Sử dụng json_encode ($ json_array, JSON_HEX_QUOT); từ php 5.3: http://php.net/manual/en/json.constants.php

+0

Tôi định dạng json của riêng mình và chỉ chèn giá trị như "{\" key \ ":" .json_encode ($ value). "}" trong đó $ value là một chuỗi có dấu ngoặc kép. Đây là giải pháp đơn giản nhất đã làm việc cho tôi. JSON.parse (x) hoạt động hoàn hảo trong trường hợp này – Alex

15

tôi succefully chỉ làm điều này:

$json = str_replace("\u0022","\\\\\"",json_encode($phpArray,JSON_HEX_QUOT)); 

json_encode() theo mặc định sẽ thoát khỏi " để \". Nhưng JSON vẫn sai cho json.PARSE(). Vì vậy, bằng cách thêm tùy chọn JSON_HEX_QUOT, json_encode() sẽ thay thế " bằng \u0022. json.PARSE() vẫn sẽ không thích \u0022. Vì vậy, chúng tôi cần thay thế \u0022 bằng \\". \\\\\" được thoát \\".

LƯU Ý: bạn có thể thêm tùy chọn JSON_HEX_APOS để thay thế báo giá đơn với giá trị unicode HEX nếu bạn có vấn đề về javascript đơn quote.

ví dụ: json_encode($phpArray, JSON_HEX_APOS|JSON_HEX_QUOT));

+0

này làm việc cho tôi Cảm ơn bạn – West55

+3

PHP: $ encodedData = json_encode ($ phpArray, JSON_HEX_APOS | JSON_HEX_QUOT); JS:... JSON.parse (' '); Hoàn hảo. – pirs

+0

Có !!! điều này đơn giản là đã làm các trick :) Cảm ơn bạn đã tiết kiệm trong ngày :) –

1

Tôi chỉ chạy vào vấn đề này và các vấn đề thực tế là tôi quên thêm một tiêu đề application/json thích hợp trước khi phun ra các dữ liệu JSON thực tế.

header('Content-Type: application/json'); 
Các vấn đề liên quan