【问题标题】:How to JSON.parse ignoring suffix after object如何 JSON.parse 忽略对象后的后缀
【发布时间】:2021-04-26 18:29:42
【问题描述】:

我有一个输入字符串

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 对象而忽略尾随文本?

【问题讨论】:

  • 对尾随文本中可能存在的字符是否有任何限制?
  • @Gershy 没有限制,可以有任何文字。

标签: javascript json jsonparser


【解决方案1】:

您可以解析一次,从错误消息中提取错误位置,从该位置删除所有内容并再次解析。很蹩脚,但工作(大部分)。

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)

【讨论】:

  • 太棒了!唯一的缺点是错误的文本可能没有标准化,并且很难区分真正的语法错误导致的错误与仅由尾随文本导致的错误
  • @Gershy: 是的,解析错误信息是极其蹩脚的,但是用内置的JSON似乎没有别的办法了。
【解决方案2】:

如果你讨厌你的 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));

【讨论】:

  • 请使用@georg 的答案,而不是这个:)
【解决方案3】:

试试

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

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

JSON.parse(input)

这将删除最后的 }

之后的所有内容

【讨论】:

  • 这里的问题是数组、字符串、数字、truefalsenull 都是有效的JSON.parse 输入,更不用说尾随文本可能恰好包含巧合的分隔符}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多