如何 JSON.parse 忽略对象后的后缀

How to JSON.parse ignoring suffix after object

我有一个输入字符串

let input = '{"username": "John Doe", "email": "john@example.com"} trailing text'

我想 JSON.parse 它,但由于尾随文本而失败。

Uncaught SyntaxError: Unexpected token t in JSON at position 54
    at JSON.parse (<anonymous>)
    at <anonymous>:1:6

我如何解析此文本中的 JSON 对象而忽略尾随文本?

你可以解析一次,从错误消息中提取错误位置,从该位置开始的所有内容都被砍掉,然后再次解析。相当蹩脚,但有效(大部分)。

let input = '{"username": "John Doe", "email": "john@example.com"} trailing text'


try {
    JSON.parse(input)
} catch(e) {
    let m = e.message.match(/position\s+(\d+)/)
    if (m)
        input = input.slice(0, m[1])
}


result = JSON.parse(input)
console.log(result)

如果您不喜欢 cpu,您可以对您的输入重复应用 JSON.parse,但每次尝试后删除最后一个字符:

let parseJsonWithArbitrarySuffix = str => {
  
  while (str) {
    try { return JSON.parse(str); } catch(err) {}
    str = str.slice(0, -1);
  }
  
  throw new Error(`Invalid input`);
  
};

let input = '{"username": "John Doe", "email": "john@example.com"} trailing text';
console.log(parseJsonWithArbitrarySuffix(input));

尝试

let input = '{"username": "John Doe", "email": "john@example.com"} trailing text'

input = input.slice(0, input.lastIndexOf('}') + 1)

JSON.parse(input)

这将删除最后一个}

之后的所有内容