使用stream-json提取嵌套JSON中的RESPONSE值问题
使用stream-json提取嵌套JSON中的RESPONSE值
stream-json的流式解析会逐个输出JSON的语法token(比如开始对象、键名、字符串片段等),想要提取深层嵌套的RESPONSE,需要跟踪当前解析的层级路径,当路径匹配到目标位置时捕获对应内容。
解决方案代码
const path = []; let isCapturing = false; let responseContent = ''; stream.on('data', (parsedData) => { switch (parsedData.name) { case 'startObject': // 处理数组内的对象,替换数组标记为第一个元素索引(适配你的目标结构) if (path.at(-1) === '[]') { path.pop(); path.push('[0]'); } break; case 'startArray': path.push('[]'); break; case 'keyValue': // 替换末尾的数组标记或直接添加键名 if (path.at(-1) === '[]' || path.at(-1)?.startsWith('[')) { path.pop(); } path.push(parsedData.value); break; case 'stringChunk': // 检查当前路径是否匹配目标位置 const targetPath = 'outputs[0].structVal.candidates.listVal[0].structVal.content.stringVal[0]'; const currentPath = path.join('.'); if (currentPath === targetPath) { responseContent += parsedData.value; isCapturing = true; } break; case 'endArray': case 'endObject': // 退出当前层级时弹出路径 path.pop(); // 完成捕获后输出结果 if (isCapturing) { console.log('提取到的RESPONSE:', responseContent); isCapturing = false; responseContent = ''; } break; } });
代码说明
- 路径跟踪:用
path数组记录当前解析到的JSON层级,比如遇到键outputs就加入数组,遇到数组就标记[],数组内的对象则替换为[0](适配你的目标结构中都是单元素数组的情况)。 - 捕获逻辑:当当前路径匹配到
outputs[0].structVal.candidates.listVal[0].structVal.content.stringVal[0]时,开始累加stringChunk的内容。 - 结束处理:退出目标层级时(遇到
endArray或endObject),输出捕获到的RESPONSE并重置捕获状态。
如果你的JSON数组存在多个元素,只需要调整数组索引的跟踪逻辑(比如维护一个索引栈,每次进入数组时初始化索引,每遇到一个元素递增索引)即可适配。
内容的提问来源于stack exchange,提问作者aan
相关产品推荐
相关产品推荐

