AJAX调用返回的响应文本包括JSON字符串。我需要:
我不太担心步骤2和3,但是我不知道如何执行步骤1。我当时在考虑使用正则表达式,但是我不知道该怎么做,因为我的JSON可能具有嵌套对象的多个级别或数组。
您不能使用正则表达式从任意文本中提取JSON。由于正则表达式通常不够强大,无法验证JSON(除非可以使用PCRE),因此它们也无法匹配JSON-如果可以的话,它们还可以验证JSON。
但是,如果您知道JSON的顶级元素始终是对象或数组,则可以采用以下方法:
{
[
}
]
JSON.parse()
这是一个提取JSON对象并返回该对象及其位置的函数。如果您确实还需要顶级数组,则应该扩展它:
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]));
演示(在nodejs环境中执行,但也应在浏览器中运行):https ://paste.aeum.net/show/81/