dify工作流中需用ast.literal_eval解析伪json字符串,避免json.loads()报错;再通过类型校验、get链式调用和默认值兜底安全提取嵌套字段。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Dify工作流中处理LLM返回的嵌套、类型混杂、结构不稳定的JSON数据时,直接用json.loads()会频繁报错中断流程,必须采用适配Dify特有数据形态的解析策略。
识别Dify中的「伪JSON」字符串
进入Python节点后,先检查input.get("payload")的原始值:若内容含单引号、True/False/None、元组或字节串(如"{'status': True, 'data': [1, 2]}"),这就是Dify典型的Python字面量序列化结果,【绝不能用json.loads()直接解析】。
这种格式由Dify内部str()序列化生成,常见于LLM节点直连Python节点、或上游Python节点未显式json.dumps()输出的场景。
运行print(repr(input.get("payload")))可快速确认是否含单引号及首字母大写的布尔值。
用ast.literal_eval安全解析嵌套结构
方法一:基础解析
导入ast模块→调用ast.literal_eval(input.get("payload", "None"))→将结果赋给data变量。
这一步绕过JSON语法限制,能正确还原list、dict、True、False、None等Python原生类型,且天然防御代码注入——遇到__import__或函数调用会直接抛ValueError异常而非执行。
方法二:带容错的封装函数
定义safe_eval(s): try: return ast.literal_eval(s) except (ValueError, SyntaxError): return {} →再用data = safe_eval(input.get("payload", ""))。
该写法避免因空字符串、None或纯文本导致整个节点崩溃,下游可基于空字典做默认分支处理。
从动态结构中稳定提取字段
第一步:判断data是否为字典或列表
if isinstance(data, dict) and "result" in data: target = data["result"];elif isinstance(data, list): target = data[0] if data else {};else: target = data。
第二步:逐层安全取值
使用.get()链式调用:value = target.get("items", [{}])[0].get("metadata", {}).get("priority", "medium")。
第三步:类型强制校验
count_str = target.get("count", "0");count = int(count_str) if str(count_str).isdigit() else 0。
这三步组合可应对模型返回{ "result": { "items": [...] } }或{ "result": [...] }两种嵌套层级,且防止字符串"42"参与数值计算时报错。
处理None与空值引发的KeyError
在访问嵌套键前,先用isinstance(data, dict)和key in data双重校验,而非直接data["user"]["profile"]["name"]。
更稳妥写法:user = data.get("user") or {}; profile = user.get("profile") or {}; name = profile.get("name", "unknown")。
这一步省去try-except包裹,语义清晰,且避免因中间某层为None导致AttributeError。
批量提取同构数组中的特定字段
方法1:列表推导式+默认兜底
items = data.get("items", []);names = [item.get("name", "") for item in items if isinstance(item, dict)]。
方法2:过滤无效项后再映射
valid_items = filter(lambda x: isinstance(x, dict) and "id" in x, items);ids = [x["id"] for x in valid_items]。
注意:若items本身是字符串或None,第一种写法中.get("items", [])会返回空列表,推导式自动跳过;第二种filter在items非列表时会报错,【务必前置校验items类型】。











