如何 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)
这将删除最后一个}
之后的所有内容
我有一个输入字符串
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)
这将删除最后一个}
之后的所有内容