如何使用JavaScript从语音识别API返回的无效JSON串中提取最后一个元素
解决方案
完全可以实现提取需求,不需要更换API,这类返回格式是实时语音识别API的通用设计,会逐段返回中间识别结果,最后一段为完整识别结果,以下是具体实现方案:
实现思路
返回内容是多个独立JSON对象拼接的无效JSON串,我们只需要匹配到最后一个完整的JSON对象,解析后提取text字段即可。
代码实现
高容错性实现(推荐)
从后往前遍历字符匹配完整JSON结构,不受多余空白、嵌套JSON结构影响,兼容所有Node.js版本:
function extractLastFinalText(rawResponse) { let bracketCount = 0; let lastJsonStr = ''; let currentStr = ''; // 倒序遍历匹配最后一个完整JSON对象 for (let i = rawResponse.length - 1; i >= 0; i--) { const char = rawResponse[i]; currentStr = char + currentStr; if (char === '}') bracketCount++; else if (char === '{') bracketCount--; if (bracketCount === 0) { lastJsonStr = currentStr.trim(); break; } } if (!lastJsonStr) return null; try { const lastObj = JSON.parse(lastJsonStr); return lastObj.text ?? null; } catch (parseErr) { return null; } } // 测试示例 const testRawData = `{ "text": "Play" } { "text": "Play astronaut" } { "text": "Play astronaut in the" } { "text": "Play astronaut in the ocean" } { "entities": {}, "intents": [], "text": "Play astronaut in the ocean.", "traits": {} } `; console.log(extractLastFinalText(testRawData)); // 输出:Play astronaut in the ocean.
轻量实现
如果确认API返回内容仅包含纯JSON对象拼接、无多余非JSON内容,可以用字符串替换转成合法JSON数组的方式实现,性能更高:
function extractLastFinalTextLite(rawResponse) { try { // 替换多个JSON间隔为逗号,包裹为合法JSON数组 const validArrayStr = `[${rawResponse.trim().replace(/}\s*\{/g, '},{')}]`; const resultArr = JSON.parse(validArrayStr); return resultArr.at(-1)?.text ?? null; } catch (err) { return null; } }
内容的提问来源于stack exchange,提问作者nasser aldosry
相关产品推荐
相关产品推荐

