INI 转 JSON 实战:从 [section] 到嵌套对象,迁移老配置不丢一个键
讲清楚 INI 配置文件怎么转成 JSON:段头变嵌套对象、key=value 变属性、注释自动清掉,顺带和 YAML、properties 对比,帮你把老服务的配置迁到新栈。
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