Câu hỏi Biến an toàn chuỗi JSON thành đối tượng


Cho một chuỗi dữ liệu JSON, làm thế nào bạn có thể biến chuỗi đó thành một đối tượng JavaScript một cách an toàn?

Rõ ràng bạn có thể làm điều này một cách không an toàn với một cái gì đó như ...

var obj = eval("(" + json + ')');

... nhưng điều đó khiến chúng ta dễ bị tổn thương bởi chuỗi json chứa mã khác, điều này có vẻ rất nguy hiểm khi chỉ đơn giản là eval.


1130
2017-09-05 00:12


gốc


Trong hầu hết các ngôn ngữ eval mang một rủi ro bổ sung. Đánh dấu một cánh cửa mở để được khai thác bởi tin tặc. BAO GIỜ, hãy nhớ rằng tất cả javascript chạy trên máy khách. CHỜ ĐỢI rằng nó sẽ bị thay đổi bởi tin tặc. Họ có thể EVAL bất cứ điều gì họ muốn, chỉ bằng cách sử dụng giao diện điều khiển. Bạn phải xây dựng bảo vệ của bạn ở phía máy chủ. - Beachhouse
Ok, bây giờ là năm 2014 và bạn không bao giờ nên sử dụng eval để phân tích cú pháp chuỗi JSON vì bạn sẽ hiển thị mã của mình để "chèn mã". Sử dụng JSON.parse(yourString) thay thế. - Daniel
Dữ liệu JSON có phải là chữ không? - shanechiu


Các câu trả lời:


JSON.parse(jsonString) là một cách tiếp cận JavaScript thuần túy miễn là bạn có thể đảm bảo một trình duyệt hợp lý hiện đại.


1704
2018-04-16 11:45



Tôi chắc rằng nó an toàn cho Node.js - Stephen
@vsync bạn nhận ra rằng đây là CHỈ CÓ Trả lời Javascript thuần túy ... nếu bạn đọc mô tả cho thẻ javascript, bạn sẽ thấy điều này ... "Trừ khi một thẻ cho một khung / thư viện cũng được bao gồm, một câu trả lời JavaScript thuần túy được mong đợi.".. Tôi cho cái này +1 là câu trả lời javascript duy nhất ... - iConnor
Khá an toàn để sử dụng. - Redsandro
Nếu bạn đang làm NodeJS, không có cách nào tôi sẽ tải lên jQuery chỉ để phân tích một jsonString thành một đối tượng JSON. Vì vậy, upvote câu trả lời của Jonathan - Antony
Theo liên kết này nó được hỗ trợ bởi IE8 +, mặc dù nó nói: Requires document to be in IE8+ standards mode to work in IE8. - JoshuaDavid


Phương thức jQuery hiện không được chấp nhận. Sử dụng phương pháp này để thay thế:

let jsonObject = JSON.parse(jsonString);

Câu trả lời gốc sử dụng chức năng jQuery không dùng nữa:

Nếu bạn đang sử dụng jQuery chỉ cần sử dụng:

jQuery.parseJSON( jsonString );

Đó là chính xác những gì bạn đang tìm kiếm (xem jQuery tài liệu).


856
2017-09-02 14:07



Có lý do nào để sử dụng điều này qua JSON.parse () không? - Frank
jQuery.parseJSON mặc định để sử dụng JSON.parse nếu nó tồn tại, vì vậy lý do duy nhất để sử dụng nó trên thực tế là nếu bạn cần một dự phòng cho <IE7. Nó đã được thay đổi cách trở lại trong jQuery 1.6: james.padolsey.com/jquery/#v=1.6.0&fn=jQuery.parseJSON - Karl-Johan Sjögren
Cập nhật năm 2016: Kể từ jQuery 3.0, $ .parseJSON không được chấp nhận và bạn nên sử dụng phương thức JSON.parse gốc thay thế. - jkdev


Chỉnh sửa: Câu trả lời này là dành cho IE <7, cho các trình duyệt hiện đại, kiểm tra câu trả lời của Jonathan ở trên.

Chỉnh sửa: Câu trả lời này đã lỗi thời và Câu trả lời của Jonathan ở trên (JSON.parse(jsonString)) bây giờ là câu trả lời hay nhất.

JSON.org có trình phân tích cú pháp JSON cho nhiều ngôn ngữ bao gồm 4 ngôn ngữ khác nhau cho Javascript. Tôi tin rằng hầu hết mọi người sẽ xem xét json2.js thực hiện goto của họ.


138
2017-09-05 00:13



Tôi ước mọi người sẽ ngừng bỏ phiếu bầu chọn này. Đó là chính xác khi nó được đăng trong năm 2008. Chỉ cần upvote mới. - John
Nếu câu trả lời hiện đã lỗi thời, hãy cân nhắc cập nhật nó. - Sotirios Delimanolis
cho IE <8, bạn cần sử dụng nó. - Mahmoodvcs


Sử dụng mã đơn giản được trình bày trong các mục sau liên kết trên MSDN.

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

và ngược lại

var str = JSON.stringify(arr);

61
2017-12-15 23:26



Hãy cố gắng trích dẫn các liên kết bằng tiếng Anh (đối với khán giả quốc tế của chúng tôi) ... như msdn.microsoft.com/en-us/en-uk/library/ie/… - MikeD


Tôi không chắc chắn về những cách khác để làm điều đó nhưng đây là cách bạn làm điều đó trong Nguyên mẫu (hướng dẫn JSON).

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

Đang gọi evalJSON () với đúng như đối số sanitizes chuỗi đến.


17
2017-09-05 00:13





Điều này có vẻ là vấn đề:

Một đầu vào được nhận, thông qua ajax websocket vv, và nó sẽ luôn ở định dạng String - nhưng bạn cần phải biết nếu nó là JSON.parsable. Vấn đề là, nếu bạn luôn chạy nó thông qua JSON.parse, chương trình CÓ THỂ tiếp tục 'thành công' nhưng bạn vẫn sẽ thấy lỗi được ném trong bảng điều khiển với "Lỗi: mã thông báo không mong muốn 'x'" đáng sợ.

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

15
2018-04-29 07:37



KHÔNG. Vấn đề là bạn đang mong đợi một đối tượng JSON và có thể kết thúc với (function(){ postCookiesToHostileServer(); }()); hoặc thậm chí là những thứ tuyệt vời hơn trong bối cảnh của Node. - Yaur
JSON.parse cũng tẩy sạch đầu vào của các hàm (trong trường hợp này sẽ không giúp ích như đối tượng IIF -> của nó). Có vẻ như cách tốt nhất để đi về chủ đề này là thử / nắm bắt. (Xem chỉnh sửa) - Cody


Nếu bạn đang sử dụng jQuery, bạn cũng có thể làm $.getJSON(url, function(data) { });

Sau đó, bạn có thể làm những việc như data.key1.something, data.key1.something_else, v.v.


11
2017-10-24 13:57



bạn đang sử dụng jQuery phải không? - Alexandre C.


$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Hàm gọi lại được truyền dữ liệu trả về, sẽ là đối tượng hoặc mảng JavaScript như được xác định bởi cấu trúc JSON và được phân tích bằng cách sử dụng $.parseJSON() phương pháp.


10
2018-05-06 06:23





Chỉ để cho vui, đây là cách sử dụng hàm:

 jsonObject = (new Function('return ' + jsonFormatData))()

9
2017-10-15 08:11



Cách tiếp cận thú vị, tôi không chắc chắn tôi sẽ sử dụng điều này với JSON.Parse có sẵn, nhưng nó là tốt đẹp để xem ai đó suy nghĩ bên ngoài của hộp.
Điều này rất giống với việc sử dụng eval để làm điều đó và không an toàn. : P - Florrie
Điều này có tất cả những hạn chế của việc sử dụng eval nhưng phức tạp hơn và khó hơn cho người bảo trì hiểu. - Quentin


Nếu bạn muốn phương pháp này có thể được sử dụng theo cách này.Đối tượng dữ liệu mà bạn muốn ex: Data = '{result: true, count: 1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

Phương pháp này thực sự hữu ích trong Nodejs Nếu bạn đang làm việc với lập trình cổng nối tiếp


8
2017-07-15 18:53



Nó thực sự buồn cười như thế nào mọi người đang cố định để "eval là ác" và họ sẽ làm bất cứ điều gì để tránh nó, thậm chí viết lại toàn bộ eval chức năng .. - diynevala
Sự đồng thuận lừa này có phải là một phương pháp an toàn biến chuỗi thành đối tượng JSON không? Tôi có thể sử dụng điều này là không cần nhập thêm js. - Whome
BẤT KÌ tiếp cận bằng cách sử dụng eval hoặc là Function cũng dễ bị tổn thương - Slai