基础概念 · YAML 与 JSON 配置格式

YAML 与 JSON 配置:格式、字段和迁移

把 .yaml 改名为 .json,不能让配置换个客户端就能用。格式决定数据怎么写,内核决定字段怎么解释;迁移时两项都要对得上。

全部概念工具使用教程引用资料

数据格式与代理协议

YAML 和 JSON 规定数据怎样写;代理协议规定连接双方怎样交换数据。配置还需要内核解释字段,例如某个 port 是监听端口还是远端端口。

一份配置还需要应用规定字段含义。例如 port 这个名字在某个配置里可能表示监听端口,在另一个对象里可能表示远端端口。格式规范只能说明它是一个键和一个值,不能决定它实际用在哪里。

因此查看“支持 YAML”之前,应先确认客户端调用什么内核、接收哪类配置,以及是否先进行转换。相关关系可见 客户端、内核与订阅的区别。

同一份数据的两种写法

下面把同一组数据分别写成 JSON 和 YAML,比较层级、列表和类型。它们是格式示例,不是某个代理客户端的完整配置。

示例代码
{
  "name": "本机演示",
  "port": 1080,
  "enabled": false,
  "labels": ["测试", "本机"]
}

对应的 YAML 可以用缩进表达层级,用短横线表达列表:

示例代码
name: "本机演示"
port: 1080
enabled: false
labels:
  - "测试"
  - "本机"

两种写法中 1080 是数字,false 是布尔值;加引号后的 "1080" 或 "false" 则是字符串。应用是否接受这些类型由字段要求决定。YAML 的缩进要用空格保持一致;标准 JSON 不包含注释和末尾多余逗号,某些程序允许扩展写法也不代表所有解析器都允许。

扩展名不会转换文件内容

把 demo.yaml 改成 demo.json,里面的文字不会变化。标准 JSON 解析器仍会读到 YAML;即使语法能解析,字段也要符合目标内核。

反过来,某些 YAML 解析器能读取 JSON 风格内容,也不说明它知道某个内核的配置字段。是否按扩展名选择解析器、是否接受多种格式,是具体程序的行为。应看当前版本文档,不靠“文件能打开”推断可导入。

导入前先用文本编辑器看内容:它是完整配置、仅含节点的提供者文件,还是一串分享链接?这些材料即使使用相同后缀,入口和用途也可能不同。一次只测试一份副本,保留原文件以便返回已知状态。

Clash、sing-box 与 Xray 的字段差别

Clash/mihomo 常用 YAML,sing-box 和 Xray 常用 JSON。后两者的入站、出站和路由字段也不同,迁移需要重新对应结构。

配置容器与内核字段是不同层次
配置体系典型字段形状需要核对的内容
Clash / mihomoproxies、proxy-groups、rules节点、策略组与按顺序匹配的规则。
sing-boxinbounds、outbounds、route入站与出站类型、标签、监听字段及路由动作。
Xrayinbounds、outbounds、routing协议字段、入站与出站标签及路由规则对象。

例如 sing-box 入站使用 type,Xray 入站使用 protocol,监听端口的字段也不完全相同。只替换这几个名字仍不算完成迁移,因为 DNS、路由、传输与认证结构也要对应。Xray 命令支持的其他输入格式同样只改变表达容器,不会把另一内核的字段变成 Xray 字段。

按语法、字段和版本查报错

先读完整错误和附近行号,再看它属于语法、字段、版本还是资源引用。行号指向读取失败的位置,漏掉的符号可能在上一行。

  1. 语法层:检查 JSON 引号与逗号,或 YAML 的缩进、冒号和列表层级。行号一般提示读取在哪里失败,但真正缺失的符号可能在上一行。
  2. 字段层:确认文件属于这个内核,字段位于正确对象中,数字、字符串、列表和布尔值类型符合要求。
  3. 版本层:确认运行的实际内核版本,核对字段加入、弃用或改变的版本;客户端版本不能直接替代内核版本。
  4. 资源层:检查规则文件、证书、地理数据等引用是否存在,路径是相对于哪一个工作目录。

“未知字段”可能来自错误配置体系或版本差异;即使程序忽略了未知字段,目标功能也可能没有生效。保留完整错误和版本信息,避免一次删除多段配置后失去问题线索。

配置迁移先检查 YAML 或 JSON 语法,再检查目标内核字段与版本,最后验证实际请求和分流。
先解决语法,再核对内核与版本,最后验证运行行为。

转换前列出需要保留的行为

普通 YAML 与 JSON 转换器主要改变数据写法,代理转换器才可能处理协议字段。迁移前列出必须保留的节点、DNS 和规则,再检查转换结果。

如果只转换出节点列表,原来的策略组、规则顺序、DNS 解析路径、TUN 设置和本地覆盖可能没有保留。客户端显示“导入成功”只能证明它接受了结果,不证明每个域名会走同一条路径。分流规则尤其要检查目标标签是否存在、最终规则是什么,参考 分流规则说明。

迁移前备份完整配置,列出必须保留的行为,转换后逐项对照。订阅链接和配置可能含访问令牌、节点凭据与内部域名,应优先用可信本地工具处理;在线工具的处理方式需要明确了解后再使用。

校验配置,再测试实际连接

保存文件后,先让对应内核读取并检查。下面分别是 sing-box 和 Xray 的命令,只运行与你的配置匹配的一条。

示例代码
sing-box check -c ./config.json
xray run -test -config ./config.json

检查模式不会启动本例中的代理进程或调整系统代理。程序不在 PATH 时,Linux/macOS 使用实际文件路径,Windows PowerShell 可用 .\sing-box.exe 或 .\xray.exe。检查成功仍不能证明远端服务可达。

  1. 确认实际加载的是刚检查的文件,启动后没有重复监听或端口冲突。
  2. 对你需要访问的域名做一次请求,确认客户端日志显示预期规则与出站。
  3. 分别核对必需的 DNS、IPv4/IPv6 与 UDP 行为,按实际需要测试这些功能。
  4. 升级后重跑同一组最小案例;出现差异时可以恢复备份与原版本。

具体可运行示例见 sing-box 指南与 Xray-core 指南。两篇都提供了完整本机配置与请求命令。

常见问题

YAML 和 YML 是两种不同格式吗?

通常不是,.yaml 与 .yml 是 YAML 文件常用的不同扩展名。具体程序是否接受两个后缀仍由它的读取规则决定,文件内容与字段兼容性需要另外确认。

JSON 能添加 // 注释吗?

标准 JSON 不允许注释。一些程序支持 JSONC 或自行移除注释,但不能把这种扩展行为当作所有 JSON 解析器的通用规则。

为什么复制后看起来一样,YAML 却报错?

缩进空格、制表符、全角标点或上一行结构可能发生变化。用能显示不可见字符的编辑器检查错误行附近,保留统一空格缩进。

参考资料

原理和协议定义可查以下标准与官方文档。文中的流程图由 AFQKit 绘制。

客户端、内核与订阅 →客户端、内核与订阅:从安装到连接规则与分流 →分流规则怎么工作:模式、策略组与 DNS

返回基础概念 · 按症状排查问题