在扣子开源版 Coze Studio 工作流里,JSON 字符串与对象数组是两种数据。下游需要 Array<Object>,上游却返回一段带方括号的 String 时,可以用 Python 代码节点做一次解析和结构校验,再引用真正的数组输出。
本文适用于已有 Coze Studio 工作流与可用代码执行组件的用户。示例以 2026 年 10 月 1 日读取的开源提交 fefb05ff27be 为依据,该版本代码节点后端只接受 Python 执行;不要照搬商业版 JavaScript 示例。以下转换代码做过本地逻辑检查,未在读者的 Studio 执行环境中实测。

明确输入与输出
本例输入名为 payload,类型为 String,内容是下面这段虚构问答 JSON。代码节点输出 records 为对象数组,count 为 Integer。
[
{"question":"链接多久有效?","answer":"生成后 24 小时。"},
{"question":"最多下载几次?","answer":"同一链接最多 3 次。"}
]
目标不是“把一切都转成数组”,而是只接受本例定义的问答结构。顶层是对象、数组里混入字符串或答案为空,都应报出明确错误。下游工具有其他字段要求时,要另外调整校验和输出定义。
配置代码节点与输出结构
- 在工作流里连接开始 → 代码 → 结束。开始增加 String 参数 payload;代码节点同名输入 payload 引用开始.payload。
- 代码节点语言选择 Python。保留平台的 Args、Output 类型提示,替换 main 函数主体为下面的实现。
- 输出声明 records 为 Array<Object>,每个对象包含 question、answer 两个 String 字段;count 为 Integer。名称必须与 return 中的键一致。
- 结束节点引用代码.records 和代码.count,保持对应类型;如后续接插件,直接引用 records,不要再转为字符串。
入口函数、args.params 和输出结构的对应关系可参考官方代码节点文档。商业版支持的包或语言不自动等于开源环境已安装;本例只用标准库 json。
import json
async def main(args: Args) -> Output:
raw = args.params.get("payload")
if not isinstance(raw, str) or not raw.strip():
raise ValueError("payload 必须是非空 JSON 字符串")
try:
records = json.loads(raw)
except json.JSONDecodeError as exc:
raise ValueError("payload 不是合法 JSON") from exc
if not isinstance(records, list):
raise ValueError("JSON 顶层必须是数组")
clean = []
for index, item in enumerate(records):
if not isinstance(item, dict):
raise ValueError(f"records[{index}] 必须是对象")
question = item.get("question")
answer = item.get("answer")
if not isinstance(question, str) or not question.strip():
raise ValueError(f"records[{index}].question 必须是非空字符串")
if not isinstance(answer, str) or not answer.strip():
raise ValueError(f"records[{index}].answer 必须是非空字符串")
clean.append({"question": question.strip(), "answer": answer.strip()})
return {"records": clean, "count": len(clean)}
这里有意只输出 question、answer,其他字段不会保留。空数组 [] 被接受并得到 count=0;是否允许零条记录,应由后续业务节点决定。代码不调用模型,也不产生凭空补充的答案。
试运行时同时看原始输出和最终输出
在开始.payload 填入上面的 JSON,运行后应得到 count=2,records 是两个对象,第一条 question 为“链接多久有效?”。打开代码节点原始输出与最终输出,再核对结束节点返回的类型及内容。
原始输出用于确认 Python return 了什么,最终输出用于确认平台按声明提供给下游的是什么。原始输出有 records,最终却缺少它时,检查输出名称与结构;最终数组正常,下游仍报“应该为 array”时,检查下游是否误引用整个对象、count 或开始.payload。
| 输入 | 预期行为 | 验证目的 |
|---|---|---|
| 上面的两条问答数组 | records 两条、count=2 | 正常解析与字段保留 |
| {“question”:”测试”} | 报“JSON 顶层必须是数组” | 不把对象偷偷包成数组 |
| [“测试”] | 报 records[0] 必须是对象 | 不把字符串数组当对象数组 |
| [{“question”:”测试”,”answer”:””}] | 报 answer 必须非空 | 拒绝缺失的业务字段 |
| 不是 JSON | 报 payload 不是合法 JSON | 输入错误可定位 |
| [] | records=[]、count=0 | 空数组与执行失败区分 |
常见问题
为什么界面有代码节点,却执行不了?
编辑器能保存代码,不证明部署的 Python 执行组件可用。若错误是无法连接执行服务、执行超时或模块不可用,先看 Studio 服务与执行组件的日志;本例 json 不需要额外安装第三方包。环境没有跑通时,不要用空数组伪装成功结果。
已经是对象数组,还需要 json.loads 吗?
不需要。本例只用于 String 输入;若上游真实类型已是 Array<Object>,直接引用并做所需校验即可。对数组调用 json.loads 会失败,先检查类型再选择转换方式。
想写进飞书多维表格,能直接复用 records 吗?
不能仅凭变量同名判断。不同工具对 records 元素的字段要求不同,可能需要 fields 等嵌套结构。先读取所用工具的参数定义,再按它的契约映射数据;本文只完成 JSON 到问答对象数组的转换,没有写入任何表格。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31539.html