一、links 连接的双向一致性检查
在IDE中直接编辑JSON时,最容易出错的是 links 数组与节点 inputs/outputs 中的 links 字段不一致,导致工作流导入后连接线丢失或报错。
问题现象:修改节点ID或删除节点后,litegraph.links 数组中的连接信息与节点内部的 inputs[].link 和 outputs[].links 不匹配。
连接结构解析:
// links 数组中的一条连接
[link_id, source_node_id, source_slot_index, target_node_id, target_slot_index, data_type]
// 例如:[1, 1, 0, 2, 0, "string"]
// 表示:连接ID=1,从节点1的第0个输出槽 → 节点2的第0个输入槽,数据类型为string
必须保持的一致性:
- 源节点的
outputs[slot_index].links数组必须包含该连接的ID - 目标节点的
inputs[slot_index].link必须等于该连接的ID links数组中的连接ID必须唯一且连续
检查脚本示例(Python):
import json
def validate_links(workflow_json):
links = workflow_json['litegraph']['links']
nodes = {node['id']: node for node in workflow_json['litegraph']['nodes']}
for link in links:
link_id, src_id, src_slot, tgt_id, tgt_slot, _ = link
# 检查源节点输出
if link_id not in nodes[src_id]['outputs'][src_slot].get('links', []):
print(f"错误:连接{link_id}未在源节点{src_id}的输出槽{src_slot}中找到")
# 检查目标节点输入
if nodes[tgt_id]['inputs'][tgt_slot].get('link') != link_id:
print(f"错误:连接{link_id}未在目标节点{tgt_id}的输入槽{tgt_slot}中找到")
二、代码字符串中的转义字符处理
在JSON中直接编写Python代码时,换行符、引号等特殊字符必须正确转义,否则会导致JSON解析失败或代码格式错乱。
常见问题:
- 多行代码中的
\n必须写成\\n(JSON字符串中的转义) - 代码中的双引号必须转义为
\" - 代码中的反斜杠必须转义为
\\
错误示例:
{
"properties": {
"策略代码": "class MyFactor(Factor):
def calculate(self, factors):
return factors['close']"
}
}
上面的代码直接换行会导致JSON解析失败。
正确做法:
{
"properties": {
"策略代码": "class MyFactor(Factor):\n def calculate(self, factors):\n return factors['close']"
},
"widgets_values": ["class MyFactor(Factor):\n def calculate(self, factors):\n return factors['close']"]
}
IDE技巧:
- 使用IDE的"转义/反转义"功能(VS Code插件:JSON Escape)
- 先在Python文件中写好代码,然后用Python的
json.dumps()自动转义 - 使用多行字符串时,可以用
"""三引号包裹,但JSON中仍需转义为\"\"\"
Python辅助脚本:
code = """class MyFactor(Factor):
def calculate(self, factors):
return factors['close']"""
import json
escaped = json.dumps(code) # 自动处理所有转义
print(escaped) # 输出:\"class MyFactor(Factor):\\n def calculate(self, factors):\\n return factors['close']\"