本文速览

订阅地址是获取入口,Base64 是文本编码,分享链接描述单个节点,原生 JSON 则可以描述完整的内核运行配置。本文适合遇到“订阅解析失败”“JSON 无法导入”或需要迁移节点的用户:先辨认实际响应,再拆解字段,最后在本地完成转换与连接检查。

一、订阅地址、Base64 与 JSON 不是同一层概念

复制到客户端的订阅地址通常是一条 HTTPS URL。客户端访问它后,才会得到节点列表或配置内容。地址末尾有没有 .json 并不能决定格式;同一个接口也可能根据请求参数或客户端标识返回不同内容。排查时应看实际响应,而不是只看文件名。

常见的 Base64 订阅,是先将多条分享链接按行排列,再把整段 UTF-8 文本做 Base64 编码。它没有把节点变成另一种协议,也没有提供保密能力。拿到内容的人通常可以还原服务器地址与认证信息,因此订阅地址本身应视作凭据保存。

客户端兼容的链接列表订阅

推荐

维护多个节点时优先选择。内容可能是明文链接列表,也可能在外层套一层 Base64;客户端解析成功后生成节点条目。

适合:日常更新节点、在多台设备上分别导入

单条 vmess:// 或 vless:// 链接

描述一个连接方案,适合临时传递和逐项排错。它通常不携带整套 DNS、入站和路由规则,也不会自动获取后续变更。

适合:手动导入、对照节点字段、单节点迁移

内核原生 JSON 配置

可以包含 inbounds、outbounds、routing 与 dns。必须确认目标内核及版本支持相应字段,不能直接当作普通节点订阅。

适合:固定部署、自定义路由、需要保留完整运行配置

判断顺序:先识别内容,再选择导入入口

解码后若是逐行分享链接,使用节点或订阅导入;若是带有 inbounds、outbounds 的对象,先按自定义配置检查。不要仅因两者都出现 JSON 就混用导入入口。

二、vmess://:外层 Base64 与内层节点 JSON

常见的 VMess 分享格式为 vmess:// 加上一个 Base64 字符串,解码后是节点描述对象。下面展示解码后的示例。域名和 UUID 仅用于说明结构,不能用于实际连接;v 的值 "2" 是分享格式版本,不是内核版本。

{
  "v": "2",
  "ps": "示例 VMess WS",
  "add": "node.example.net",
  "port": "443",
  "id": "e7c3a416-5c9e-4f2b-9d81-73d14a9b8620",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "node.example.net",
  "path": "/gateway",
  "tls": "tls",
  "sni": "node.example.net"
}
字段含义核对重点
add / port连接地址与端口示例为 443;不能把整条 HTTPS URL 填入地址栏。
id用户 UUID应与服务端一致,注意前后空格。
aid历史 alterId 参数现代部署通常使用 0;不要为了排错任意改成旧值。
scyVMess 内容加密选项auto 不等于外层 TLS,二者属于不同层。
net / path传输方式与路径这里是 WebSocket;/gateway 要与服务端配置对应。
host / sniWebSocket Host 与 TLS 服务器名称二者作用不同,即使示例中相同也不能随意互换。
ps显示备注改备注不会修复认证失败或握手错误。

这里的 JSON 并不是可以直接交给内核运行的配置。它没有完整的 outbounds 层级,字段名也采用了分享格式的简写。转换成原生配置时,需要把 add 映射到服务器地址,把用户信息放进相应协议的用户数组,再分别构建传输和 TLS 设置。

三、vless://:UUID、查询参数与备注的边界

VLESS 分享链接通常采用 URI 结构,而不是把整个 JSON 包进 Base64。下面是一条 VLESS over TCP + TLS 的教学示例;它不使用 REALITY,也没有配置 Vision 流控。

vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=node.example.net#VLESS%20TLS%20Example

如果拿到的是 REALITY 节点,还要逐项核对链接中的 security=reality、pbk、sid、fp 与 sni。这些参数不能从 UUID 或服务器地址推算出来,也不能通过“VMess 转 VLESS”自动补齐。客户端最终生成的内核字段应以其对应版本为准。

互转边界:重新编码不等于更换协议

可以把已有分享链接打包成 Base64 订阅,也可以将已知参数整理成 JSON;但把前缀从 vmess 改成 vless 不会让服务端改用 VLESS。协议迁移需要服务端提供对应入站与认证信息。

四、在本地解码与重新编码 Base64 订阅

订阅里可能包含访问令牌和有效 UUID。处理真实内容时,优先使用本地文本工具或空白页面的浏览器开发者工具,不要上传到不明转换网站。下面的函数只转换传入的字符串,不发起网络请求,也不需要粘贴订阅地址。

function decodeBase64Utf8(input) {
  let text = input.trim().replace(/\s+/g, "")
    .replace(/-/g, "+").replace(/_/g, "/");
  text += "=".repeat((4 - text.length % 4) % 4);
  const bytes = Uint8Array.from(atob(text), ch => ch.charCodeAt(0));
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

function encodeBase64Utf8(input) {
  const bytes = new TextEncoder().encode(input);
  let binary = "";
  for (const byte of bytes) binary += String.fromCharCode(byte);
  return btoa(binary);
}

const demoLink =
  "vless://[email protected]:443" +
  "?encryption=none&security=tls&type=tcp&sni=node.example.net#Example";

const subscription = encodeBase64Utf8(demoLink + "\n");
console.log(subscription);
console.log(decodeBase64Utf8(subscription));

这段代码兼容常见 Base64URL 字符替换,并补齐结尾填充。UTF-8 的转换是为正确处理中文备注;直接对中文调用 btoa() 可能报错。执行前应读懂代码,真实凭据也不宜保存在公共设备的控制台记录中。

  1. 得到订阅的响应正文后,先判断是否已经以 vmess:// 或 vless:// 开头。如果是明文链接,不必再解码外层。
  2. 如果内容为 Base64,解码一次,再按换行拆分。去掉空行,但不要删除 URI 内部有效字符或改写大小写敏感的路径。
  3. 对每条 vmess:// 去掉前缀后,单独调用解码函数,再用 JSON.parse() 检查其对象结构。
  4. 要还原成列表订阅,用换行连接完整的分享链接,再调用编码函数。不要编码界面上显示的节点名称。

若响应以 <!DOCTYPE html> 开头,应先检查登录状态、地址是否过期或接口是否返回错误页面。若解码后是合法 JSON,也要继续判断它是错误消息、节点数组还是完整内核配置。Base64 解码成功,只能证明编码可还原,不能证明内容能连接。

五、从分享链接整理为 Xray 原生 JSON

下面把前面的 VLESS TLS 示例整理成最小运行配置,便于观察层级。它绑定本机 127.0.0.1:10808 作为 SOCKS 入站,出站连接到示例域名的 443 端口。该地址没有可用服务,配置仅供字段对照;实际运行前需要换成服务端提供的参数。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "local-socks",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "node.example.net",
            "port": 443,
            "users": [
              {
                "id": "e7c3a416-5c9e-4f2b-9d81-73d14a9b8620",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "node.example.net",
          "allowInsecure": false
        }
      }
    }
  ]
}

本例没有单独编写 routing,默认通过首个出站处理请求,也没有提供分流规则集或系统代理设置。启动一个 SOCKS 监听端口,并不意味着系统中的全部应用都会自动使用它。若 10808 已被桌面客户端占用,应先停止重复实例或修改端口。

转换方案:区分节点迁移与整套配置迁移

节点迁移:分享链接或列表订阅
  • 保留地址、端口、UUID、传输与安全参数。
  • 由客户端生成本地入站和运行配置。
  • DNS 与 routing 在目标客户端单独核对。
完整部署:原生 JSON
  • 检查 inbounds 的监听地址和端口占用。
  • 核对出站标签、路由引用与外部文件依赖。
  • 使用对应内核验证配置,再启动测试。

从完整 JSON 导出一个分享链接时,DNS、路由、多出站选择与本地监听设置通常不能随链接一并保留。

“原生 JSON”也不意味着跨内核通用。Xray 与 V2Fly 共享部分配置结构,但协议能力和字段演进并不完全一致。例如含 REALITY 的 Xray 配置不能仅通过更换文件名交给 V2Fly 使用。转换器应明确输入格式、输出内核和参数覆盖范围。

六、v2rayN 导入:订阅地址与剪贴板链接分开操作

以下以 v2rayN 7.x 中文界面的常见菜单为参考,不同小版本的标点和入口位置可能调整。先判断手里的内容是 HTTPS 订阅地址、单条分享链接,还是完整配置文件,再选择入口。把网页地址贴到节点导入窗口,常会得到“没有有效内容”一类结果。

  1. 添加订阅地址:打开「订阅分组」→「订阅分组设置」,新建分组,填写备注及提供方给出的订阅 URL,保存后选中该分组。
  2. 获取节点列表:在「订阅分组」菜单中选择更新当前订阅的操作。能够直连时先走不通过代理的更新;直连超时而现有代理可用时,再选择通过代理更新。
  3. 导入单条链接:复制完整的 vmess:// 或 vless://,使用「服务器」→「从剪贴板导入批量URL」。多条链接按行排列,保持每条链接完整。
  4. 导入完整配置:查找服务器菜单中的自定义配置导入入口,选择本地 JSON 文件并匹配所需内核。不要预期它会自动拆成可逐项编辑的普通节点。
  5. 检查实际运行:设为活动节点并重新加载,查看日志是否有配置解析、端口占用或 TLS 握手错误,再发起真实网页请求。

手工导入的节点通常只是当前快照。提供方之后更换地址或 UUID,不会自动修改已经复制出来的链接;订阅更新则可能覆盖该分组内的节点。需要长期保留的手动修改,宜放在独立分组,避免与订阅维护的条目混在一起。

七、订阅解析与互转常见问题

Base64 能解码,为什么 v2rayN 还是导入失败?

先看解码结果是否真的是逐行分享链接。若是 HTML、错误提示或原生配置对象,应换对应入口;若是链接列表,先只导入其中一条,检查前缀、换行和 UUID,缩小问题范围。

拿到 JSON 文件,可以直接重新编码成订阅吗?

不能仅靠编码完成格式转换。若文件是完整内核配置,需要先选定一个出站,按分享格式提取协议、服务器、用户和传输参数,再生成链接。只把整个文件做 Base64 编码,通常不会得到客户端期望的节点列表。

订阅更新超时,是不是订阅格式错了?

超时首先属于获取阶段的问题。检查订阅地址是否完整、域名能否解析、当前网络能否访问;已有可用节点时再尝试通过代理更新。只有拿到响应后出现解析错误,才继续检查 Base64 和节点格式。

导入成功但打不开网页,应该改哪个参数?

先确认活动节点和系统代理状态,再查看日志。连接被拒绝优先核对地址与 443 等服务端口;TLS 错误核对 SNI、证书与系统时间;认证失败核对 UUID。不要用开启跳过证书验证替代正确的 TLS 设置。

中文备注乱码,会影响节点连接吗?

备注通常不影响连接,但乱码提示转换流程可能没有正确处理 UTF-8。VMess JSON 用 UTF-8 后再做 Base64;VLESS 的备注和查询参数按 URI 规则编码。不要把整条链接反复整体编码,否则冒号、问号与分隔符也会失去结构作用。

完成互转后的验收顺序应是:内容能解析、字段能对应、内核能启动、请求能通过。保存原始订阅或配置作为参照,只在副本上修改。更多字段结构可查阅配置大全,协议名称与传输术语可对照术语表。