Phân tích cú pháp chuỗi dưới dạng JSON với dấu ngoặc kép?


81

Tôi có một chuỗi

str = "{'a':1}";
JSON.parse(str);
VM514:1 Uncaught SyntaxError: Unexpected token '(…)

Làm cách nào để phân tích cú pháp chuỗi trên (str) thành một đối tượng JSON?

Điều này có vẻ giống như một phân tích cú pháp đơn giản. Nó không hoạt động mặc dù.


6
Dấu nháy đơn không đúng định dạng json, vì vậy nếu bạn đang nhận được một cái gì đó như thế, có lẽ bạn sẽ cần phải sử dụng str.replace () và thay thế qoutes duy nhất với "trước khi cố gắng phân tích nó
AUP

1
Dù sao thì bạn cũng nên cố gắng sử dụng các dấu nháy đơn cho các chuỗi trong javascript. var str = "bad example";không phải là thực hành tốt, tốt hơn hãy làm như sau: var str = 'good example';=> như thế này, bạn sẽ không gặp bất kỳ vấn đề nào với JSON và bạn cũng sẽ không gặp bất kỳ vấn đề nào với HTML. :)
ReeCube

3
@ReeCube Điều đó có vẻ ít hơn một ý kiến ​​- dù sao thì không có vấn đề gì với HTML, nó chấp nhận cả hai. Đối với JSON, tại sao lại tạo nó bằng chuỗi? Tôi không thực sự nhớ lại lần cuối cùng tôi xây dựng JSON từ bất kỳ thứ gì khác ngoài một đối tượng.
Dave Newton

2
@DaveNewton Tôi thường xuyên tạo chuỗi json từ node, python, php.
alfadog67 Ngày

1
Tôi đoán tôi không hiểu ý bạn. nhưng ok.
alfadog67

Câu trả lời:


87

Các tiêu chuẩn JSON đòi hỏi dấu ngoặc kép và sẽ không chấp nhận dấu nháy đơn, cũng sẽ phân tích cú pháp.

Nếu bạn có một trường hợp đơn giản không có dấu ngoặc kép thoát trong chuỗi của bạn (điều này thường là không thể, nhưng đây không phải là JSON), bạn có thể đơn giản str.replace(/'/g, '"')và bạn nên kết thúc với JSON hợp lệ.


5
Câu trả lời của bạn sẽ làm xáo trộn dữ liệu. Một câu trả lời tốt sẽ thay đổi cấu trúc chứ không phải dữ liệu bên trong cấu trúc dữ liệu.
Timothy Gonzalez

3
@ssube, toàn cục thay thế dấu ngoặc kép bằng dấu ngoặc kép là phương pháp đầu tiên xuất hiện trong tâm trí và là một phương pháp slipshod, vì nó có thể phá hủy các giá trị từ điển. Ví dụ: 'title': "Mama's Friend"sẽ trở thành "title": "Mama"s Friend", mà tất nhiên là không hợp lệ! Tôi nên phản đối câu trả lời của bạn nhưng tôi không phản đối. Nhận xét này có giá trị hơn nhiều.
Apostolos

31

Tôi biết đó là một bài viết cũ, nhưng bạn có thể sử dụng JSON5 cho mục đích này.

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>

8
Được ủng hộ vì các giải pháp trên sẽ không thành công với những thứ như: {'section': "24'"} trở thành: {"section": "24""} và sẽ không phân tích cú pháp.
snedkov

1
Đây phải là câu trả lời hàng đầu.
Sam R.

Giải pháp hoàn hảo. Đang cố gắng loại bỏ một chuỗi JSON từ thẻ tập lệnh của html, thẻ này chứa dấu ngắt dòng và khoảng trống. Đã lưu ngày của tôi!
DriLLFreAK100

Đối với tôi điều này đã hiệu quả<script>JSON.stringify(some_jsonString)</script>
jAntoni

12

Nếu bạn chắc chắn JSON của bạn nằm trong tầm kiểm soát của bạn một cách an toàn (không phải do người dùng nhập) thì bạn chỉ cần đánh giá JSON. Eval chấp nhận tất cả các loại báo giá cũng như tên thuộc tính không được trích dẫn.

var str = "{'a':1}";
var myObject = (0, eval)('(' + str + ')');

Các dấu ngoặc đơn bổ sung là bắt buộc do trình phân tích cú pháp eval hoạt động. Eval không phải là xấu khi nó được sử dụng trên dữ liệu bạn có quyền kiểm soát. Để biết thêm về sự khác biệt giữa JSON.parse và eval (), hãy xem JSON.parse so với eval ()


2
Thậm chí nếu bạn nghĩ eval không phải là xấu xa trong trường hợp này, JSON.parse luôn nhanh hơn là: jsperf.com/json-parse-vs-eval/3
Arkanoid

@Arkanoid Điểm chuẩn bạn đã liên kết không áp dụng cho trường hợp này vì nó chỉ sử dụng JSON hợp lệ (do JSON.stringify)
syockit

8
var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

Điều này giải quyết các vấn đề đối với tôi.


1
điều này cũng sẽ sửa đổi dữ liệu. {'a':"A'A"}sẽ trở thành{"a":"A"A"}
GodSaveTheDoge

7

Một cái gì đó như thế này:

var div = document.getElementById("result");

var str = "{'a':1}";
  str = str.replace(/\'/g, '"');
  var parsed = JSON.parse(str);
  console.log(parsed);
  div.innerText = parsed.a;
<div id="result"></div>


6

Không cho phép sử dụng dấu ngoặc kép cho các khóa trong JSON. Bạn cần sử dụng dấu ngoặc kép.

Đối với trường hợp sử dụng của bạn, có lẽ đây sẽ là giải pháp dễ dàng nhất:

str = '{"a":1}';

Nguồn :

Nếu một thuộc tính yêu cầu dấu ngoặc kép, thì phải sử dụng dấu ngoặc kép. Tất cả các tên thuộc tính phải được bao quanh bởi dấu ngoặc kép.


-11
json = ( new Function("return " + jsonString) )(); 

Vui lòng giải thích câu trả lời của bạn
Sterling Archer

3
Các bạn, đừng bao giờ làm điều này. Đây là siêu an toàn
jpumford

Nguyên tắc chính của việc sử dụng Functionthay vì eval là âm thanh, nhưng mọi thứ khác đều sai. Nó phải làvar json = Function("'use strict';return " + jsonString)()
Jack Giffin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.