2010-06-30 45 views
11

Vì định dạng JSON chỉ định rằng không nên thoát khỏi các dấu nháy đơn, hầu hết các thư viện (hoặc thậm chí là trình phân tích cú pháp JSON gốc) sẽ thất bại nếu bạn có một dấu trích dẫn duy nhất trong nó. Bây giờ điều này thường không phải là vấn đề vì hầu hết thời gian bạn làm một XHR tìm nạp một số dữ liệu được định dạng là JSON và bạn sử dụng responseText chứa chuỗi JSON của bạn, sau đó bạn có thể phân tích cú pháp, v.v.Cách sử dụng chuỗi ký tự JSON?

Trong trường hợp cụ thể này, Tôi có một chuỗi JSON được lưu trữ trong cơ sở dữ liệu dưới dạng văn bản ... do đó cơ sở dữ liệu chứa một số thứ như {"property":"value"} và tôi muốn xuất kết quả này như một phần của trang HTML được tạo bởi máy chủ để mã JavaScript trong trang đó trông giống như sau:

var x = '{"property":"value"}'; 

Bây giờ nếu chuỗi JSON trong cơ sở dữ liệu chứa một giá duy nhất như thế này:

{"property":"val'ue"} 

Sau đó, tôi cần phải thoát khỏi nó, không thì anh sẽ không bao giờ có thể sử dụng nó như là một chuỗi:

console.clear(); 
var obj = {prop:"val'ue"}; 
var str = JSON.stringify(obj); 
console.log("JSON string is %s",str); 
console.dir(JSON.parse(str)); //No problem here 


//This obviously can't work since the string is closed and it causes an invalid script 
//console.dir(JSON.parse('{prop:"val'ue"}')); 

//so I need to escape it to use a literal JSON string 
console.dir(JSON.parse('{"prop":"val\'ue"}')); 

Câu hỏi đặt ra sau đó là lý do tại sao {"prop":"val\'ue"} không được coi là một chuỗi JSON hợp lệ?

+0

vì vậy, vấn đề với 'console.dir (JSON.parse ('{" prop ":" val \' ue "} '))' là gì? Nó hoạt động cho tôi (chrome) – mykhal

+0

Đúng vậy, câu hỏi của tôi là lý do tại sao nó được coi là không hợp lệ JSON {"prop": "valu \ 'ue"} (theo thông số kỹ thuật) khi ở trong tình huống tôi mô tả bạn cần để có điều này trong chuỗi của bạn. Điều này đang buộc tôi phải xử lý lại chuỗi JSON đã được mã hóa. – SBUJOLD

Trả lời

4

Trong JavaScript - chuỗi '{"prop":"val\'ue"}'một cách chính xác để mã hóa JSON như là một chuỗi đen.

Khi trình thông dịch JavaScript đọc chuỗi được trích dẫn một lần, nó sẽ chuyển đổi \' thành '. Giá trị của chuỗi là {"prop":"val'ue"} là JSON hợp lệ.

Để tạo không hợp lệ JSON chuỗi, bạn sẽ phải viết '{"prop":"val\\\'ue"}'

Nếu tôi hiểu câu hỏi đúng, bạn đang cố gắng để tạo ra mã JavaScript sẽ thiết lập một số biến lên phiên bản được giải mã của một Chuỗi JSON bạn đã lưu trữ trong cơ sở dữ liệu. Vì vậy, bây giờ bạn đang mã hóa chuỗi một lần nữa, như là cách để có được chuỗi này vào JavaScript là sử dụng một chuỗi chữ, đi qua nó thông qua JSON.parse(). Bạn có thể dựa vào việc sử dụng bộ mã hóa JSON phía máy chủ để mã hóa chuỗi JSON dưới dạng chuỗi ký tự JavaScript. Ví dụ:

<?php $jsonString = '{"prop":"val\'ue"}'; ?> 
var myJson = JSON.parse(<?php echo json_encode($jsonString) ?>); 
// Prints out: 
// var myJson = JSON.parse("{\"prop\":\"val'ue\"}"); 
// And results: Object - { prop: "val'ue"} 

Tuy nhiên, nếu bạn là chắc chắn 100% JSON sẽ có giá trị, và không cần trọng lượng của việc kiểm tra phân tích cú pháp/lỗi thêm - bạn có thể bỏ qua tất cả những gì thêm mã hóa và chỉ viết:

var myJson = <?php echo $jsonString; ?> 

Hãy nhớ rằng, JSON là cú pháp JavaScript hợp lệ để xác định đối tượng sau khi tất cả!

+1

Thx, tôi chắc chắn đã đi vào suy nghĩ sai, tốt nhất là chắc chắn để mã hóa lại nó như bạn nói, theo cách này Trình thông dịch javaScript sẽ lưu trữ giá trị chuỗi 'được giải thích', khiến cho VALUE của biến là một chuỗi JSON hợp lệ. – SBUJOLD

+0

@SBUJOLD - không có vấn đề :) vui vì tôi có thể chỉ đạo bạn trở lại đúng con đường! – gnarf

+1

+1 Giải thích tốt. – amelvin

2

Theo jsonlint nó là hợp lệ mà không thoát báo giá duy nhất, vì vậy đây là tốt:

{"prop": "val'ue"} 

Nhưng điều này là không hợp lệ:

{"prop":"val\'ue"} 

Theo json.org json:

hoàn toàn độc lập với ngôn ngữ nhưng sử dụng các quy ước là fa miliar để lập trình viên của C-gia đình của ngôn ngữ, bao gồm C, C++, C#, Java, JavaScript, Perl, Python, và nhiều khác

Vì vậy, nó là công ước ngôn ngữ trong ngôn ngữ c-type liên quan đến đảo ngược (\) có nghĩa là ví dụ của bạn không hợp lệ.

+0

+1 điều này chắc chắn trả lời "Tại sao' \ ''không hợp lệ trong chuỗi JSON" một phần của câu hỏi – gnarf

1

Bạn có thể thử những điều sau đây, tuy nhiên, nó rất xấu.

JSON.parse("{\"obj\":\"val'ue\"}");

Hoặc chỉ lưu chuỗi vào biến trước. Điều này không nên lưu trữ giá trị dấu chéo ngược bằng chữ và do đó trình phân tích cú pháp JSON sẽ hoạt động.


var str = '{"obj" : "val\'ue"}'; 
JSON.parse(str); 

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