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

YAML 和 JSON 有什么区别?代理配置格式、字段兼容与转换问答

先看答案

YAML、JSON 规定配置文本怎样表达数据;客户端与内核规定这些数据怎样生效。改扩展名或转换语法,不能把 Clash、sing-box、Xray 的配置规则自动互换。检查配置要分别确认语法、字段、版本与实际运行行为。

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

YAML 和 JSON 到底是什么,是代理协议吗?

它们是数据表达格式,不是代理协议。可以把格式理解为写表格的方法:哪些内容是名字,哪些是数字,哪些是一组项目。VLESS、Trojan 或 SOCKS 才涉及连接时双方如何交换数据;选择 YAML 或 JSON 不会自动增加协议支持。

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

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

同一份数据用 YAML 和 JSON 怎么写?

可以写成不同文本,但保留相同的数据结构与类型。下面是教学用的数据,不是要导入某个代理客户端的完整配置。JSON 用大括号、方括号和逗号区分结构,字符串和字段名使用双引号:

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

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

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

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

把 .yaml 改成 .json,就能换客户端了吗?

不能;文件名不会重写内容,也不会迁移字段语义。如果把上面的 YAML 文件直接改成 demo.json,里面仍然是 YAML 文本。按标准 JSON 读取的程序可能在第一个字段处就报语法错误。

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

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

Clash、sing-box 和 Xray 为什么不能直接互用?

不同内核定义了不同的字段、层级和运行语义。Clash/mihomo 常见 YAML 配置,sing-box 官方配置使用 JSON,Xray 常见配置也使用 JSON;两者都写 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. 资源层:检查规则文件、证书、地理数据等引用是否存在,路径是相对于哪一个工作目录。

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

转换器能完整保留节点、DNS 和分流规则吗?

不能默认认为转换是无损的。通用 YAML↔JSON 转换器主要搬运数据结构;针对代理的转换器还可能映射节点与部分配置,但是否支持某个字段和版本,需要看它明确公布的能力。

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

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

改完配置以后,怎样才算真正可用?

先通过目标内核检查,再验证具体请求与路由行为。已经安装相应内核时,可对准备使用的本地文件运行检查命令。下面两条分别属于不同内核,只执行与你的配置匹配的一条:

示例代码
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 却报错?

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

同一个 port 字段在所有配置中含义相同吗?

不一定。字段含义依赖它所属的对象与应用定义,可能是本机监听端口,也可能是远端连接端口。要看对应内核的字段文档。

节点名称都保留了,迁移就算成功了吗?

不算。名称保留不证明认证、传输、DNS、策略组与规则行为都相同,还要检查实际请求使用的出站和必要功能。

配置检查成功以后,还需要测试连接吗?

需要。检查主要验证配置能否解析和加载,实际连接还受端口、网络、远端服务与应用设置影响,应按自己的使用需求验证。

官方来源与核对

本文依据以下标准与官方资料整理,资料核对日期为 2026.10.02。概念说明与具体软件实现有区别,实际设置仍需对照对应版本文档。

客户端、内核与订阅 →客户端、内核和订阅是什么?配置导入、兼容与更新问答规则与分流 →全局、规则、直连怎么选?策略组、DNS 与 TUN 分流问答

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