将string拆分为JSON和非JSON部分

我有这样的string:

var s = '{ "foo": { "bar": { "baz": 5 } } } Some more content'; 

有没有一种可靠的方法在JavaScript中将string拆分为JSON和非JSON部分? 这个string总是以有效的JSON开始,但除了JSON可以包含任何东西,所以像计数大括号这样的技巧将无法正常工作。

我目前看到的最好的select是使用json-lint模块获取错误的位置并在错误位置分割。

任何其他的想法?

使用与KevBot相同的方法,但可能会消除很多try {} catch(e) {}

 var s = '{ "foo": { "bar": { "baz": 5 } } } Some mo}re }content'; var offset = s.length + 1; while (offset > 0) { offset = s.lastIndexOf('}', offset - 1); var maybe_json = s.slice(0, offset + 1); try { var json = JSON.parse(maybe_json); break; } catch (e) {} } var rest = s.slice(offset + 1); console.log(json); // { "foo": { "bar": { "baz": 5 } } } console.log(rest); // " Some mo}re }content" 

正如在评论中所述, 你真的应该看清楚你正在使用的string ,所以它只是实际的JSON。

不过,如果你真的想用自己的方式继续前进,那么只需用vanilla JavaScript即可。 这假设你说,string总是以“有效的”JSON开始。

 function splitMyJsonString(string) { var jsonData = getValidJson(string); return [ jsonData.json, string.split('').slice(jsonData.errorIndex).join('') ]; function getValidJson(s) { var newString = ''; for (var i = 0; i < s.length; i++) { try { return {json: JSON.parse(newString), errorIndex: i} } catch (e) { newString += s.charAt(i); } } return {json: null, errorIndex: 0} } } 

你从函数调用中得到的是一个数组,其中第一个索引是你parsing的JSON作为一个对象,第二个索引是剩余的string(因为你要求分割)。 如果在string的开头没有find有效的json,则会返回第一个索引为null的数组。

 var s = '{ "foo": { "bar": { "baz": 5 } } } Some more content'; console.log(splitMyJsonString(s)); // logs: [Object, " Some more content"] // If no valid JSON is at the start of the string... var z = 'Some more content'; console.log(splitMyJsonString(z)); // logs [null, "Some more content"] 

首先,我们将整个string分割成数组,以便稍后进行数组切片。 然后我们从string的开头得到有效的JSON。 我们这样做的方式是试图一次parsing一件,直到我们得到一个真正的通行证(叹气)。 一旦通过,或者我们不返回值。 我在解释中留下了一些空白,但是要点已经被覆盖了。

 function splitMyJsonString(string) { var jsonData = getValidJson(string); return [ jsonData.json, string.split('').slice(jsonData.errorIndex).join('') ]; function getValidJson(s) { var newString = ''; for (var i = 0; i < s.length; i++) { try { return { json: JSON.parse(newString), errorIndex: i } } catch (e) { newString += s.charAt(i); } } return { json: null, errorIndex: 0 } } } var s = '{ "foo": { "bar": { "baz": 5 } } } Some more content'; console.log(splitMyJsonString(s)); // logs: [Object, " Some more content"] // If no valid JSON is at the start of the string... var z = 'Some more content'; console.log(splitMyJsonString(z)); // logs [null, "Some more content"]