2013-04-19 48 views
8

Tôi đang bị gửi một chuỗi JSON bị hình thành từ một bên thứ ba. Tôi đã thử sử dụng JSON.parse(str) để phân tích cú pháp thành đối tượng JavaScript nhưng tất nhiên là không thành công.Phân tích cú pháp chuỗi JSON bị hình thành

Các Lí do là các phím không dây:

{min: 100} 

Trái ngược với chuỗi hợp lệ JSON (mà phân tích tốt):

{"min": 100} 

tôi cần phải chấp nhận các chuỗi hình thành bệnh cho bây giờ. Tôi tưởng tượng quên các phím báo giá đúng là một sai lầm phổ biến. Có cách nào tốt để thay đổi điều này thành chuỗi JSON hợp lệ để tôi có thể phân tích cú pháp không? Bây giờ tôi có thể phải phân tích nhân vật theo nhân vật và thử và tạo thành một vật thể, nghe thật khủng khiếp.

Ý tưởng?

+0

Dường như có một số giải pháp ở đây: http://stackoverflow.com/questions/4210160/safely-parsing-a-json-string-with-unquoted-keys?rq=1 – showdev

+0

Tôi nghĩ rằng việc sử dụng hàm tạo hàm nên làm việc trong trường hợp này: 'var data = new Function ('return' + illFormedJSON;)()' – m90

+1

'(?: [az] +): +' Tôi muốn tìm kiếm tất cả các khóa không thích hợp. Đây không phải là một regex hoàn chỉnh cho nên cho bạn một nơi để bắt đầu. Không có thời gian để trả lời đầy đủ câu hỏi. – travis

Trả lời

5

Bạn chỉ có thể đánh giá, nhưng đó sẽ là thực hành bảo mật kém nếu bạn không tin tưởng nguồn. Giải pháp tốt hơn sẽ là sửa đổi chuỗi theo cách thủ công để trích dẫn các phím hoặc sử dụng công cụ mà người khác đã viết để thực hiện điều này cho bạn (hãy xem https://github.com/daepark/JSOL được viết bởi daepark).

+0

đã sử dụng https://github.com/daepark/JSOL, được chuyển đổi thành mô-đun Node.js. – lostintranslation

1

Tùy thuộc vào những gì khác trong JSON, bạn chỉ cần thực hiện chuỗi thay thế và thay thế '{' bằng '{"'':' với '":'.

2

Tôi đã làm điều này chỉ thời gian gần đây, sử dụng Uglifyjs để đánh giá:

var jsp = require("uglify-js").parser; 
var pro = require("uglify-js").uglify; 

var orig_code = "var myobject = " + badJSONobject; 
var ast = jsp.parse(orig_code); // parse code and get the initial AST 
var final_code = pro.gen_code(ast); // regenerate code 

$('head').append('<script>' + final_code + '; console.log(JSON.stringify(myobject));</script>'); 

Điều này thực sự cẩu thả trong một cách, và có tất cả những vấn đề tương tự như một eval() dựa trên giải pháp, nhưng nếu bạn chỉ cần phân tích cú pháp/định dạng lại dữ liệu một lần, sau đó ở trên sẽ giúp bạn có được một bản sao JSON rõ ràng của đối tượng JS.

+1

FWIW, đây sẽ là một trong những cách làm chậm nhất. Uglify là trình phân tích cú pháp JavaScript đầy đủ; tự điều chỉnh chuỗi (ví dụ: http://stackoverflow.com/a/16110830/444991) sẽ * nhiều * hiệu quả hơn. – Matt

+0

Có, cách tiếp cận này được thiết kế cho một kịch bản xây dựng kiểu Grunt, chứ không phải là một ứng dụng thời gian thực mà hiệu quả là một mối quan tâm. – BishopZ

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