
本文介绍如何利用 jackson 的 jsonnode api 遍历任意深度的嵌套 json,将所有字符串类型的叶节点值统一截取为最多 5 个字符,支持对象、数组及混合结构,确保安全处理空值与边界情况。
本文介绍如何利用 jackson 的 jsonnode api 遍历任意深度的嵌套 json,将所有字符串类型的叶节点值统一截取为最多 5 个字符,支持对象、数组及混合结构,确保安全处理空值与边界情况。
在实际开发中,常需对动态 JSON 数据进行标准化清洗,例如限制日志字段、脱敏展示或适配前端显示宽度。Jackson 作为主流 JSON 处理库,其树模型(JsonNode)提供了灵活的遍历能力。以下方案通过递归遍历 JsonNode,精准识别并截断所有非容器型字符串值(即 isTextual() 且非对象/数组),同时保留原始 JSON 结构。
核心逻辑分为三类节点处理:
- 数组节点:遍历每个元素,递归调用;
- 对象节点:遍历所有键值对,对值节点分类处理;
- 叶节点(字符串):仅当 isTextual() 为 true 时截取前 5 字符;若原字符串长度 ≤ 5,则保持不变,避免 StringIndexOutOfBoundsException。
以下是完整可运行示例(已增强健壮性):
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.Iterator;
import java.util.Map.Entry;
public class JsonStringTruncator {
private static final int MAX_STRING_LENGTH = 5;
public static String truncateAllStringValues(String json) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(json);
truncateStringValues(root);
return mapper.writeValueAsString(root);
}
private static void truncateStringValues(JsonNode node) {
if (node == null || node.isMissingNode()) return;
if (node.isArray()) {
for (JsonNode element : node) {
truncateStringValues(element);
}
} else if (node.isObject()) {
ObjectNode objectNode = (ObjectNode) node;
Iterator<entry jsonnode>> fields = objectNode.fields();
while (fields.hasNext()) {
Entry<string jsonnode> field = fields.next();
JsonNode value = field.getValue();
if (value.isTextual()) {
String text = value.asText();
String truncated = text.length() <p>✅ <strong>关键注意事项</strong>:</p>
<ul>
<li>
<strong>安全性优先</strong>:显式检查 isTextual() 而非 !isContainerNode(),避免将数字 123456 错误转为字符串再截断;</li>
<li>
<strong>空值防护</strong>:添加 node == null || node.isMissingNode() 判断,防止 NPE;</li>
<li>
<strong>不可变性保障</strong>:JsonNode 本身不可变,操作基于 ObjectNode(可变子类),因此需确保输入为可修改节点(readTree 返回的默认实现满足);</li>
<li>
<strong>性能提示</strong>:对超大 JSON,可考虑流式解析(JsonParser)以降低内存占用,但会显著增加实现复杂度;</li>
<li>
<strong>扩展建议</strong>:如需按 key 名过滤(如仅截断 "description" 字段),可在 field.getKey() 处添加白名单判断。</li>
</ul>
<p>该方案简洁、可靠,适用于日志裁剪、API 响应预处理、测试数据生成等场景,是 Jackson 树模型实用化的典型范例。</p></string></entry>











