
本教程详细介绍了如何使用jackson objectmapper实现json美化输出的精细控制。当默认的 serializationfeature.indent_output 不足以满足特定格式要求时,可以通过定制 defaultprettyprinter 并结合 defaultindenter 来精确控制对象和数组的缩进与换行,从而生成符合预期的、结构清晰的json格式化输出。
1. 理解Jackson的JSON美化输出
Jackson库的ObjectMapper是Java中进行JSON序列化和反序列化的核心工具。为了提高JSON的可读性,ObjectMapper提供了美化(Pretty Print)输出的功能。最常见的方式是启用SerializationFeature.INDENT_OUTPUT特性:
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
启用此特性后,ObjectMapper会使用默认的DefaultPrettyPrinter来格式化JSON输出,包括添加缩进和换行。然而,默认的美化器可能无法满足所有精细的格式化需求,例如特定位置的换行符、空数组内部的空格或键值对之间冒号的空格等。当默认行为不符预期时,我们就需要更深入地定制美化器。
2. 定制DefaultPrettyPrinter以实现精细控制
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对象和数组的开始和结束括号后,以及其内部元素之间,都会有正确的换行和缩进。
Reclaim.ai
为优先事项创建完美的时间表
90 查看详情
3. 将定制的美化器集成到ObjectMapper
配置好DefaultPrettyPrinter后,需要告知ObjectMapper使用这个定制的美化器进行序列化。这可以通过setDefaultPrettyPrinter()方法实现:
ObjectMapper mapper = new ObjectMapper();// 启用缩进输出特性,虽然通过writerWithDefaultPrettyPrinter()会覆盖此设置,但通常建议一同启用。mapper.enable(SerializationFeature.INDENT_OUTPUT); mapper.setDefaultPrettyPrinter(printer); // 设置我们定制的PrettyPrinter
重要提示: setDefaultPrettyPrinter()方法设置的是ObjectMapper在启用SerializationFeature.INDENT_OUTPUT特性时将使用的默认美化器。
4. 执行JSON序列化
最后一步是使用配置好的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 key2;// private String key3;// // 构造函数、Getter/Setter// }// 准备待序列化的数据List 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();}
5. 完整示例与输出
为了更好地演示上述步骤,我们来看一个完整的示例。
首先,定义一个简单的Java POJO类:
// ActionOutput.javaimport java.util.List;import java.util.Objects; // 用于生成equals和hashCode,非序列化必需public class ActionOutput { private String key1; private List key2; private String key3; // 全参构造函数,Jackson序列化时需要 public ActionOutput(String key1, List key2, String key3) { this.key1 = key1; this.key2 = key2; this.key3 = key3; } // 无参构造函数,Jackson反序列化时可能需要 public ActionOutput() { } // Getters (Jackson需要用于序列化) public String getKey1() { return key1; } public List getKey2() { return key2; } public String getKey3() { return key3; } // Setters (如果需要反序列化) public void setKey1(String key1) { this.key1 = key1; } public void setKey2(List 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美化输出深度定制指南的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1069778.html
微信扫一扫
支付宝扫一扫