PlantUML 结构化 JSON 展示:把配置 / API 响应 / 任意 JSON 画成树
PlantUML 的“冷门”宝藏功能:把 JSON / YAML 直接当输入源,画成结构化树图。比 Graphviz 手写 dot 简单,比 Mermaid flowchart 像样,比手画 Visio 快 50 倍。
一句话开启
1 | @startjson |
@startjson / @endjson 包一段标准 JSON,PlantUML 自动把它画成树状图。YAML 同理——@startyaml / @endyaml。两个指令都来自 PlantUML 的官方 stdlib,不需要额外装插件。
它解决了什么问题
画「嵌套结构图」是文档 / 调试里最高频的苦差事之一:
- 配置文件:package.json / tsconfig.json / nx.json / docker-compose.yml 的层级和字段名
- API 响应:后端实际返回的 JSON 长什么样,前端字段对不上时拿来对账
- 状态快照:把整个 Redux store / Vuex state / Pinia store dump 出来
- 领域模型:用一个真实 JSON 实例描述 schema,比 ER 图更直观
- 测试 fixture:把 mock data 画出来,确认嵌套层级没写错
以前做这些要:(a) 手抄字段到 Visio / draw.io;(b) 用 jq + dot 写脚本;(c) 直接截图 console.log。@startjson 把 (a)(c) 干掉了,(b) 也被大幅简化——脚本只负责拼 JSON 字符串,渲染交给 PlantUML。
完整语法:所有 JSON 类型都支持
JSON 里的 6 种值类型 PlantUML 都能识别并差异化渲染:
1 | @startjson |
渲染出来的样子:
- 字符串 → 浅色背景 + 引号
- 数字 → 蓝色
- 布尔 → 紫色,
true/false区分 null→ 灰色,斜体- 数组 → 自动展开成
<array>节点,下面挂[0]、[1]… - 对象 → 自动展开成
<object>节点,下面挂字段名
高亮与样式:让重点一眼可见
单节点高亮
#highlight 标记某个 key,让它和兄弟节点视觉上区分开:
1 | @startjson |
version 节点会变成橘黄色背景。
多个 key 高亮
1 | @startjson |
给整个 JSON 上色
#highlight 后跟整个 JSON(不带 key),所有节点统一变色:
1 | @startjson |
条件高亮(满足条件才高亮)
1 | @startjson |
只有 deprecated 节点值是 false 时才被高亮——active: false 不变色。适合「找所有 enabled=false 的字段」之类场景。
真实案例:把 package.json 画出来
下面是一个 React 项目的 package.json,直接 @startjson 包起来就是一张可读的依赖 / 脚本图:
1 | @startjson |
把这一段贴在 README 里,比纯文本 JSON 直观 10 倍——新人 onboarding 第一眼就能看到「哪些是运行依赖、哪些是开发依赖、构建命令是什么」。
真实案例:API 响应对账
后端给的真实响应,调试时直接 dump 出来:
1 | @startjson |
status 和「未验证的 email」节点高亮——一眼看出「调用成功但账号未验证」。这张图直接贴 issue 评论比文字描述高效得多。
JSON 大/丑的时候怎么办
直接 @startjson 套 1000 行 JSON 会画得很挤。三个常用技巧:
1. 用 %json 指令控制格式
1 | @startjson |
PlantUML 默认会把过长的字符串截断(30 字符 + ...)。完整字符串依然在 SVG 里(选中复制可拿到),但视图上不会撑爆图。
2. 数组很长时让它换行
1 | @startjson |
数组节点默认垂直排列(节省宽度)。横向紧凑模式在大型 JSON 里更难读,别用。
3. 嵌套太深时抽变量
1 | @startuml |
把 JSON 字符串丢给 %json() 函数预处理后再 @startjson 引用——避免长字符串转义把 .puml 文件搞得一团乱。!$var = ... 是 PlantUML 预处理器赋值语法,%json() 是 stdlib 提供的 JSON 解析函数。
JSON vs YAML vs JSON5:都支持
1 | @startyaml |
@startyaml / @endyaml 是 JSON 的孪生兄弟。YAML 写起来更紧凑(不用引号、不用花括号),嵌套一多时阅读性比 JSON 还好。两种指令生成的图视觉上完全一致。
PlantUML 还支持 JSON5(带注释、尾逗号、单引号的 JSON 扩展)——只要把 @startjson 换成 @startjson5 / @endjson5。如果你团队用的是 .jsonc 配置文件(VSCode 的 settings.json / tsconfig.json),可以直接粘贴进来。
跟其他工具的对比
| 工具 | 同样的事要怎么做 | 痛点 |
|---|---|---|
| Graphviz / dot | 手写 digraph { a -> b } 节点和边 |
字段多到 50 个就累死 |
| Mermaid flowchart | 把 JSON 手动转成 flowchart TD; A-->B; |
嵌套结构要展平,写起来很丑 |
| draw.io / Visio | 拖框 + 拖线 | 无法版本化,无法 diff |
| PlantUML @startjson | 贴 JSON 即可 | 字段数 100+ 时仍可读 |
Mermaid 没有原生 JSON 指令——它要你手写 flowchart,或者用 mermaid 的 sankey / mindmap 近似,但都不如 PlantUML 这个干净。
一些“坑”和边角
1. JSON 里的转义字符
如果 JSON 里有 \" 或 \\,包在 @startjson 里时不需要再转义一层——PlantUML 解析时按字符串字面量处理。但如果你用预处理器变量(!$var = "..."),就要双重转义。
2. 注释
PlantUUMl 在 JSON/YAML 块里不支持注释——写了会报错。注释放在外面用 ' comment。
3. 大文件
字段数超过 ~500 渲染会显著变慢(dot 引擎的极限)。超过这个量考虑:(a) 只画关键子树;(b) 用 jq 预处理把不关心的字段剔掉再贴。
4. 重复 key
JSON 标准不允许重复 key,但 PlantUML 解析器会接受,渲染时只保留最后一个。代码评审别放过这种 bug。
实战工作流
1 | # 1. 从 API 拉响应 |
或者直接贴进 puml.online 的编辑器——所见即所得。
什么时候不用
- 数据库 schema 演进:用 ER 图(
@startuml+entity)比 JSON 实例清晰 - 类层次结构:用类图
- 调用关系 / 流程:用时序图或活动图
- JSON 结构本身是文档主题:用
@startjson最合适
简单说:你要展示「一段真实数据的形状」就用 JSON 图;展示「类型之间的关系」就用 UML 图。
小结
@startjson 是 PlantUML 最被低估的功能之一:
- 一行指令把任意 JSON / YAML 变成可读树图
- 支持全部 6 种 JSON 值类型自动差异化渲染
#highlight让重点 key 一眼可见,条件高亮适合「找所有 X=false 的字段」- 真实场景:配置文件结构、API 响应、状态快照、测试 fixture
- 比 Graphviz / Mermaid 手写流程图快 5-10 倍
把它加入你的文档工具箱,下次有人问你「package.json 里 dependencies 和 devDependencies 有什么区别」——直接画一张图甩过去,比解释 10 分钟更有效。
- 标题: PlantUML 结构化 JSON 展示:把配置 / API 响应 / 任意 JSON 画成树
- 作者: puml.online
- 创建于 : 2026-08-04 14:00:00
- 更新于 : 2026-08-14 21:34:29
- 链接: https://puml.online/blog/plantuml-json-diagram/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。