跳到主要内容

INI 转 JSON 实战:从 [section] 到嵌套对象,迁移老配置不丢一个键

讲清楚 INI 配置文件怎么转成 JSON:段头变嵌套对象、key=value 变属性、注释自动清掉,顺带和 YAML、properties 对比,帮你把老服务的配置迁到新栈。

发布于 作者 李雷
#ini #json #配置文件 #格式转换 #开发工具

INI 转 JSON 实战:从 [section] 到嵌套对象,迁移老配置不丢一个键

很多老服务的配置都是一份 config.ini,几十行 [section] 加 key=value,跑了好几年没人动。等你要把它搬到读 JSON 的 Node 或 Go 应用,问题就来了:手工抄一遍容易抄漏,正则替换又处理不好注释和引号。这篇讲清楚 INI 到 JSON 的转换规则到底是怎么回事,以及它和 YAML、properties 的边界在哪。

INI 的结构:段头加键值对,只有一层

INI 的世界很简单。一个方括号 [section] 是段头,它下面每一行 key=value(有些写法用 key:value)就是这个段的条目。写在第一个段头之前的键属于全局键,不归任何段管。

关键一点:INI 是扁平的,段头下面只有一层。没有"段里再套段"这种东西。这恰好对应到 JSON 的一层嵌套,每个段变成顶层的一个对象,段内的键变成这个对象的属性。理解了这个对应关系,转换就不再是黑盒。

一个真实的输入输出例子

假设你有这样一份 server.ini:

mode = prod
[server]
host = localhost
port = 8080      ; 监听端口
[logging]
level = info
file = /var/log/app.log

打开 INI 转 JSON 工具,粘进去,得到:

{
  "mode": "prod",
  "server": {
    "host": "localhost",
    "port": "8080"
  },
  "logging": {
    "level": "info",
    "file": "/var/log/app.log"
  }
}

注意三件事。第一,mode 写在所有段之前,它成了顶层的全局键,和 server、logging 平级,没被塞进某个段里。第二,port 后面那句 ; 监听端口的行内注释被剪掉了,值就只剩 8080。第三,默认情况下 8080 是字符串。如果你打开类型推断开关,它会变成真正的数字 8080,ssl=true 会变成布尔 true,这样直接复制进 config.json 就能用。

注释和引号:容易踩的边界

INI 的注释有两种,分号和井号开头的整行都会被丢掉,行尾跟着的注释也会被剪掉。但有个例外:像 color=#ffaa00 这种紧贴着内容的井号,前面没有空格,它明显是值的一部分,会被原样保留。引号里的井号同理。这个细节如果用粗暴的正则去切,十有八九会把颜色值切坏。

迁移老配置的两个坑

我自己迁过一份用了三年的 .conf,踩过两个坑,这里说一下。一个是邮编 08055,类型推断打开后它变成了数字 8055,前导零没了。要保持文本就关掉推断,或者给值加双引号。另一个是 INI 没有数组语法,源 JSON 里如果有列表值,转回 INI 时会直接报错而不是猜成逗号拼接,这是对的,免得悄悄改了语义。遇到这种情况就把列表拆成多个键。

和 YAML、properties 怎么选

三者经常被拿来比较,边界其实很清楚。

  • INI:靠 [section] 段头分组,只有一层嵌套,适合扁平的服务配置。
  • YAML:靠缩进表达任意深度的树,还支持列表,适合复杂结构,但缩进敏感容易出错。
  • Java 的 .properties:没有段,用点号键比如 server.port=8080,靠点号暗示层级。文件里是方括号段就用 INI 工具,是点号键就去用 properties 转 JSON 工具

简单说,配置不深、分组清晰用 INI 转 JSON 就够;需要深层树或数组,JSON 或 YAML 才是合适的落点。把老配置归一成 JSON 之后,后续做 diff、做 schema 校验、塞进环境变量都顺手很多。


Made by Toolora · Updated 2026-06-13