Bạn không thể sử dụng regex để trích xuất JSON từ văn bản tùy ý. Vì các regex thường là not powerful enough to validate JSON (trừ khi bạn có thể sử dụng PCRE), chúng cũng không thể khớp với nó - nếu có thể, chúng cũng có thể xác thực JSON.
Tuy nhiên, nếu bạn biết rằng phần tử cấp cao nhất của JSON của bạn luôn luôn là một đối tượng hoặc mảng, bạn có thể đi bằng các phương pháp sau đây:
- Tìm việc mở đầu tiên (
{
hoặc [
) và cuối cùng đóng (}
hoặc ]
) cú đúp trong chuỗi của bạn.
- Hãy thử phân tích cú pháp khối văn bản đó (bao gồm cả dấu ngoặc ôm) bằng cách sử dụng
JSON.parse()
. Nếu nó thành công, kết thúc và trả về kết quả được phân tích cú pháp.
- Lấy dấu ngoặc đóng trước đó và thử phân tích chuỗi đó. Nếu nó thành công, bạn được thực hiện một lần nữa.
- Lặp lại thao tác này cho đến khi bạn không có cú đúp hoặc cái nào xuất hiện trước dấu ngoặc đang mở.
- Tìm dấu ngoặc mở đầu tiên sau dấu ngoặc đơn từ bước 1. Nếu bạn không tìm thấy bất kỳ, chuỗi không chứa đối tượng/mảng JSON và bạn có thể dừng lại.
- Chuyển đến bước 2.
Đây là chức năng trích xuất đối tượng JSON và trả về đối tượng và vị trí của đối tượng. Nếu bạn thực sự cần mảng cấp cao nhất, cũng vậy, nó phải được mở rộng:
function extractJSON(str) {
var firstOpen, firstClose, candidate;
firstOpen = str.indexOf('{', firstOpen + 1);
do {
firstClose = str.lastIndexOf('}');
console.log('firstOpen: ' + firstOpen, 'firstClose: ' + firstClose);
if(firstClose <= firstOpen) {
return null;
}
do {
candidate = str.substring(firstOpen, firstClose + 1);
console.log('candidate: ' + candidate);
try {
var res = JSON.parse(candidate);
console.log('...found');
return [res, firstOpen, firstClose + 1];
}
catch(e) {
console.log('...failed');
}
firstClose = str.substr(0, firstClose).lastIndexOf('}');
} while(firstClose > firstOpen);
firstOpen = str.indexOf('{', firstOpen + 1);
} while(firstOpen != -1);
}
var obj = {'foo': 'bar', xxx: '} me[ow]'};
var str = 'blah blah { not {json but here is json: ' + JSON.stringify(obj) + ' and here we have stuff that is } really } not ] json }} at all';
var result = extractJSON(str);
console.log('extracted object:', result[0]);
console.log('expected object :', obj);
console.log('did it work ?', JSON.stringify(result[0]) == JSON.stringify(obj) ? 'yes!' : 'no');
console.log('surrounding str :', str.substr(0, result[1]) + '<JSON>' + str.substr(result[2]));
Demo (thực hiện trong môi trường nodejs, nhưng nên làm việc trong một trình duyệt, quá): https://paste.aeum.net/show/81/
Bạn không phải là người mới ở đây. Bạn đã thử cái gì? Câu trả lời của bạn trông như thế nào? –
Ngoài ra, RegEx có lẽ không phải là công cụ chính xác cho công việc. –
@Truth Cách giải quyết duy nhất của tôi cho đến nay là bao gồm các điểm đánh dấu trong văn bản phản hồi để hiển thị phần đầu và phần cuối của chuỗi JSON. Không có gì để tự hào hoặc điều đó sẽ hướng dẫn câu trả lời. – Christophe