You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
  }
});

代码说明

  1. 路径跟踪:用path数组记录当前解析到的JSON层级,比如遇到键outputs就加入数组,遇到数组就标记[],数组内的对象则替换为[0](适配你的目标结构中都是单元素数组的情况)。
  2. 捕获逻辑:当当前路径匹配到outputs[0].structVal.candidates.listVal[0].structVal.content.stringVal[0]时,开始累加stringChunk的内容。
  3. 结束处理:退出目标层级时(遇到endArray或endObject),输出捕获到的RESPONSE并重置捕获状态。

如果你的JSON数组存在多个元素,只需要调整数组索引的跟踪逻辑(比如维护一个索引栈,每次进入数组时初始化索引,每遇到一个元素递增索引)即可适配。

内容的提问来源于stack exchange,提问作者aan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:15:09