在 Java 17 之后,switch 模式匹配逐渐成为处理多态类型分派的好办法。当我们将一段 JSON 解析为树结构后,每个节点可能是对象、数组或基础值。利用 switch 配合类型模式,就能清晰地对节点做递归解析,而不必写一堆 if else。

定义统一的节点类型
首先我们把解析后的 JSON 节点抽象为几个类,都有一个公共基类 JsonNode。对象节点、数组节点和值节点分别继承它。
abstract class JsonNode {}
class JsonObject extends JsonNode {
java.util.Map<String, JsonNode> map = new java.util.HashMap<>();
}
class JsonArray extends JsonNode {
java.util.List<JsonNode> list = new java.util.ArrayList<>();
}
class JsonValue extends JsonNode {
String value;
JsonValue(String v) { this.value = v; }
}
用 switch 模式匹配做递归解析
接下来写一个递归方法,接收 JsonNode,在 switch 中用类型模式判断具体子类型,并绑定变量继续向下处理。
void parse(JsonNode node, int depth) {
switch (node) {
case JsonObject obj -> {
// 对象节点:遍历每个键值对递归
for (var entry : obj.map.entrySet()) {
System.out.println(" ".repeat(depth) + entry.getKey());
parse(entry.getValue(), depth + 1);
}
}
case JsonArray arr -> {
// 数组节点:遍历每个元素递归
for (var item : arr.list) {
parse(item, depth + 1);
}
}
case JsonValue val -> {
// 值节点:直接输出
System.out.println(" ".repeat(depth) + val.value);
}
default -> throw new IllegalStateException("未知节点类型");
}
}
为什么这样写更合适
传统写法要先 instanceof 再强转,而 switch 模式匹配在判断的同时完成绑定,代码更紧凑。递归结构也能自然映射 JSON 的嵌套层级。
简单对比
| 方式 | 可读性 | 扩展新节点类型 |
|---|---|---|
| instanceof 判断 | 一般 | 需改多处 |
| switch 模式匹配 | 好 | 集中处理 |
小结
把 JSON 节点统一为基类,再用 switch 表达式配合类型模式递归解析,是 Java 新特性在实际数据处理里很实用的写法。它让分支逻辑集中、类型安全,也方便后续增加新的节点种类。