跳到主要内容

Properties 转 JSON 实战:把 Java 配置读成嵌套对象

把 Java 的 .properties 配置转成 JSON,点号键展开成嵌套对象,server.port=8080 落到该在的位置,讲清楚 Spring Boot 迁移、和 yaml 互转、全程浏览器本地的做法。

发布于 作者 李雷
#properties #json #java #spring-boot #配置转换

Properties 转 JSON 实战:把 Java 配置读成嵌套对象

接手一个老 Java 服务,第一眼看到的往往是几百行 application.properties。键按字母排,server 的设置和 logging 的设置被混在一起,想看清结构得不停 grep 前缀。把它转成 JSON,点号键收成一棵树之后,这堆配置才真正可读。这篇讲的就是 .properties 转 JSON 这件事的几个真实场景,和容易踩的坑。

key=value 转对象,点号键转嵌套

.properties 的本质是一行行的键值对,分隔符既可以是等号也可以是冒号。server.port=8080server.port:8080 是同一回事。难点不在分隔符,在那个点号。

Java Properties.load 读出来的其实是扁平的键,server.port 就是一个字符串键。但 Spring Boot 的宽松绑定会把它当成嵌套路径,绑到 @ConfigurationProperties 的嵌套 bean 上。所以转 JSON 时有两种合理结果:展开成嵌套对象,或者原样留成扁平字符串键。

拿一个最小例子。输入:

server.port=8080
server.servlet.context-path=/api
spring.datasource.url=jdbc:mysql://localhost:3306/app
logging.level.root=INFO

开启点号键展开后,输出是这样一棵嵌套树:

{
  "server": {
    "port": "8080",
    "servlet": {
      "context-path": "/api"
    }
  },
  "spring": {
    "datasource": {
      "url": "jdbc:mysql://localhost:3306/app"
    }
  },
  "logging": {
    "level": {
      "root": "INFO"
    }
  }
}

server.port=8080 落进 server 对象里的 port 字段,正是 Spring 绑定时它该在的位置。把展开开关关掉,同一份输入就保留成 {"server.port":"8080", ...} 这样的扁平键,当下游消费方要的是字面属性名时用这个。我自己改一个 Hibernate 配置时就吃过亏:习惯性开着嵌套转,结果目标程序读的是扁平键,白白排查了半小时,后来才意识到一个开关的事。

Spring Boot 配置迁移的典型用法

最常见的场景是部署流程变了。服务还在读 application.properties,但新的 CI 把配置当成一个 JSON 块注入。这时候手工翻译几百个键又慢又容易漏,漏一个数据库密码就是一次线上事故。

把整个 properties 文件粘进 Properties ⇄ JSON 互转,保持点号键展开打开,拿到的嵌套 JSON 树能直接对上原来那批 bean,复制进 values 文件就行。带 profile 的 application-prod.properties 也是一样转,一次转一个文件。

反向也成立:你在文档里把配置设计成 JSON,但目标应用只认 java.util.Properties,切换方向后嵌套对象会扁平化回点号键,等号和 unicode 都按规范转义好,Java 读取器不用改就能收。

和 YAML 互转,以及为什么值都是字符串

很多团队后来又从 .properties 迁到了 application.yml。这条链路其实是 properties 转 JSON,JSON 再转 YAML。先把 properties 转成嵌套 JSON,结构清楚了,再用 YAML ⇄ JSON 转换 落成 yml,层级关系一一对得上,比直接手写 yaml 缩进靠谱。

这里有个反复有人问的点:为什么 port=8080 转出来是字符串 "8080" 而不是数字。因为 .properties 把一切都当文本存,它没有类型这个概念。工具如实保留是故意的:一旦去猜类型,版本号 1.10 会被悄悄变成数字 1.1,邮编 01234 会丢掉前导零变成 1234。把判断类型这件事留到你清楚意图的应用代码里去做,反而更安全。

几个容易翻车的细节

  • 冒号也是分隔符。timeout:30 是键 timeout、值 30,不是一个叫 timeout:30 的键。真要在键里写冒号,转义成反斜杠加冒号。
  • 行尾留了多余反斜杠。一行以单个反斜杠结尾会续到下一行,值末尾不小心多写一个,就会把下一行整个吞进这个值。要保留字面反斜杠,写成两个反斜杠。
  • 注释不会保留。以 #! 开头的行是注释,JSON 没有注释语法,转换时直接丢掉。要留文档说明,就把原始 .properties 放进版本库,把 JSON 当成生成产物。

全程在你的浏览器里跑

解析、展开点号键、转义、扁平化回 JSON,每一步都是标签页里的纯 JavaScript。配置、键、密钥都不上传也不记录。唯一要留心的是分享链接会把输入写进查询字符串,所以配置里有凭据时,用复制按钮粘文本,别分享网址。把它当成一个随手就能用、又不会把你的数据库密码送出去的本地工具,这是它和那些要你上传文件的在线转换器最大的区别。


Made by Toolora · Updated 2026-06-13