从文本中提取JSON

AJAX调用返回的响应文本包括JSON字符串。我需要:

  1. 提取JSON字符串
  2. 修改它
  3. 然后重新插入以更新原始字符串

我不太担心步骤2和3,但是我不知道如何执行步骤1。我当时在考虑使用正则表达式,但是我不知道该怎么做,因为我的JSON可能具有嵌套对象的多个级别或数组。

回答:

您不能使用正则表达式从任意文本中提取JSON。由于正则表达式通常不够强大,无法验证JSON(除非可以使用PCRE),因此它们也无法匹配JSON-如果可以的话,它们还可以验证JSON。

但是,如果您知道JSON的顶级元素始终是对象或数组,则可以采用以下方法:

  • 在字符串中找到第一个开头({[)和最后一个结尾(}])大括号。
  • 尝试使用来解析该文本块(包括大括号)JSON.parse()。如果成功,请完成并返回解析的结果。
  • 取上一个右括号,然后尝试解析该字符串。如果成功,您将再次完成。
  • 重复此操作,直到没有括号或当前打开的括号之前没有括号为止。
  • 在第1步中找到第一个左括号。如果找不到,则该字符串不包含JSON对象/数组,可以停止。
  • 转到步骤2。

这是一个提取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/

以上是 从文本中提取JSON 的全部内容, 来源链接: utcz.com/qa/423395.html

回到顶部