
本教程详细介绍了如何使用jackson objectmapper实现json美化输出的精细控制。当默认的 serializationfeature.indent_output 不足以满足特定格式要求时,可以通过定制 defaultprettyprinter 并结合 defaultindenter 来精确控制对象和数组的缩进与换行,从而生成符合预期的、结构清晰的json格式化输出。
Jackson库的ObjectMapper是Java中进行JSON序列化和反序列化的核心工具。为了提高JSON的可读性,ObjectMapper提供了美化(Pretty Print)输出的功能。最常见的方式是启用SerializationFeature.INDENT_OUTPUT特性:
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
启用此特性后,ObjectMapper会使用默认的DefaultPrettyPrinter来格式化JSON输出,包括添加缩进和换行。然而,默认的美化器可能无法满足所有精细的格式化需求,例如特定位置的换行符、空数组内部的空格或键值对之间冒号的空格等。当默认行为不符预期时,我们就需要更深入地定制美化器。
DefaultPrettyPrinter是Jackson用于美化JSON输出的默认实现。它提供了丰富的API来定制缩进和换行行为。要实现更精确的控制,我们需要创建并配置一个DefaultPrettyPrinter实例。
核心的定制方法是indentObjectsWith()和indentArraysWith(),它们分别用于设置对象和数组内部元素的缩进规则。这两个方法都接受一个Indenter接口的实现。Jackson提供了一个开箱即用的实现:DefaultIndenter。
DefaultIndenter允许我们定义缩进使用的字符串(例如两个空格、四个空格或一个制表符)以及换行符。通过将其应用于对象和数组,我们可以确保它们内部的元素按照一致且可控的方式进行缩进和换行。
以下是如何创建并配置一个DefaultPrettyPrinter的示例:
import com.fasterxml.jackson.core.util.DefaultIndenter;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
// ...
// 1. 创建DefaultPrettyPrinter实例
DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
// 2. 配置对象内部的缩进器
// DefaultIndenter() 默认使用四个空格作为缩进,并使用系统默认的换行符。
// 这里我们使用两个空格作为缩进字符串。
printer.indentObjectsWith(new DefaultIndenter(" ", DefaultIndenter.SYS_LF));
// 3. 配置数组内部的缩进器
// 同样使用DefaultIndenter() 来确保数组元素有正确的缩进和换行。
printer.indentArraysWith(new DefaultIndenter(" ", DefaultIndenter.SYS_LF));通过上述配置,我们确保了JSON对象和数组的开始和结束括号后,以及其内部元素之间,都会有正确的换行和缩进。
配置好DefaultPrettyPrinter后,需要告知ObjectMapper使用这个定制的美化器进行序列化。这可以通过setDefaultPrettyPrinter()方法实现:
ObjectMapper mapper = new ObjectMapper(); // 启用缩进输出特性,虽然通过writerWithDefaultPrettyPrinter()会覆盖此设置,但通常建议一同启用。 mapper.enable(SerializationFeature.INDENT_OUTPUT); mapper.setDefaultPrettyPrinter(printer); // 设置我们定制的PrettyPrinter
重要提示: setDefaultPrettyPrinter()方法设置的是ObjectMapper在启用SerializationFeature.INDENT_OUTPUT特性时将使用的默认美化器。
最后一步是使用配置好的ObjectMapper进行序列化。为了确保使用我们定制的美化器,最推荐的方式是通过writerWithDefaultPrettyPrinter()方法获取一个ObjectWriter实例,然后进行写入操作。
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
// 假设 ActionOutput 是一个简单的POJO类,包含构造函数和Getter方法
// public class ActionOutput {
// private String key1;
// private List<String> key2;
// private String key3;
// // 构造函数、Getter/Setter
// }
// 准备待序列化的数据
List<ActionOutput> res = new ArrayList<>();
res.add(new ActionOutput("value1", List.of(), null));
res.add(new ActionOutput("value2", List.of("item1", "item2"), "another value"));
try {
// 使用定制的美化器进行写入到文件
// args[1] 假设是输出文件路径
// mapper.writerWithDefaultPrettyPrinter() 会使用通过 setDefaultPrettyPrinter 设置的美化器
mapper
.writerWithDefaultPrettyPrinter()
.writeValue(new File(args[1]), res);
// 也可以写入到字符串并打印
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(res);
System.out.println(jsonString);
} catch (IOException e) {
e.printStackTrace();
}为了更好地演示上述步骤,我们来看一个完整的示例。
首先,定义一个简单的Java POJO类:
// ActionOutput.java
import java.util.List;
import java.util.Objects; // 用于生成equals和hashCode,非序列化必需
public class ActionOutput {
private String key1;
private List<String> key2;
private String key3;
// 全参构造函数,Jackson序列化时需要
public ActionOutput(String key1, List<String> key2, String key3) {
this.key1 = key1;
this.key2 = key2;
this.key3 = key3;
}
// 无参构造函数,Jackson反序列化时可能需要
public ActionOutput() {
}
// Getters (Jackson需要用于序列化)
public String getKey1() { return key1; }
public List<String> getKey2() { return key2; }
public String getKey3() { return key3; }
// Setters (如果需要反序列化)
public void setKey1(String key1) { this.key1 = key1; }
public void setKey2(List<String> key2) { this.key2 = key2; }
public void setKey3(String key3) { this.key3 = key3; }
@Override
public String toString() {
return "ActionOutput{" +
"key1='" + key1 + '\'' +
", key2=" + key2 +
", key3='" + key3 + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ActionOutput that = (ActionOutput) o;
return Objects.equals(key1, that.key1) &&
Objects.equals(key2, that.key2) &&
Objects.equals(key3, that.key3);
}
@Override
public int hashCode() {
return Objects.hash(key1, key2, key3);
}
}接下来是序列化代码:
import com.fasterxml.jackson.core.util.DefaultIndenter; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.io.
以上就是Jackson ObjectMapper JSON美化输出深度定制指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号