Jackson ObjectMapper 精确控制 JSON 格式化输出

jackson objectmapper 精确控制 json 格式化输出

本文深入探讨了如何利用 Jackson `ObjectMapper` 精细控制 JSON 的美化输出格式。尽管 `SerializationFeature.INDENT_OUTPUT` 提供了基础的缩进功能,但对于特定的换行、空数组和键值对空格等格式要求,默认设置往往不足。教程将详细介绍如何通过定制 `DefaultPrettyPrinter` 来实现对 JSON 输出格式的完全掌控,包括缩进、换行以及键值对内部的空格,并提供完整的代码示例。

Jackson ObjectMapper 美化输出的精细控制

在使用 Jackson 库进行 JSON 序列化时,我们经常需要将输出格式化为易于阅读的“美化”形式。ObjectMapper 提供了一个便捷的配置选项 SerializationFeature.INDENT_OUTPUT 来实现这一目标。然而,默认的美化输出可能无法满足所有严格的格式要求,例如:

数组或对象开始符 [ 或 { 之后立即换行。空数组 [] 不带内部空格,而不是 [ ]。键值对之间没有多余空格,即 key: “value” 而非 key : “value”。对象或数组结束符 ] 或 } 之前或之后精确的换行。

当默认的美化输出无法满足这些特定的格式需求时,我们就需要深入定制 ObjectMapper 所使用的美化打印器。

核心挑战:默认美化输出的局限性

考虑以下 JSON 序列化代码片段:

ArrayList res = manager.getRes();ObjectMapper objectMapper = new ObjectMapper();objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);objectMapper.writeValue(new File(args[1]), res);

预期输出可能是这样的:

[  {    "key1": "value",    "key2": [],    "key3": null  },  {    "key1": "value",    "key2": [],    "key3": null  }]

然而,实际输出可能更接近于:

[ {                   // 缺少在 '[' 后的换行  "key1" : "value",  "key2" : [ ],       // 空数组带有空格  "key3" : null}, {                  // 缺少在 '}' 后的换行  "key1" : "value",  "key2" : [ ],  "key3" : null       // 键值对之间带有空格} ]                   // 缺少在 '}' 后的换行

这种差异表明,SerializationFeature.INDENT_OUTPUT 仅提供了基本的缩进和换行,而对于更细节的格式控制,我们需要更高级的手段。

解决方案:定制 DefaultPrettyPrinter

Jackson 库通过 com.fasterxml.jackson.core.util.DefaultPrettyPrinter 类来管理 JSON 的美化打印行为。我们可以创建 DefaultPrettyPrinter 的实例,并对其进行配置,然后将其应用于 ObjectMapper。

1. 创建并配置 DefaultPrettyPrinter 实例

DefaultPrettyPrinter 允许我们通过 indentObjectsWith() 和 indentArraysWith() 方法来指定对象和数组内部的缩进逻辑。这两个方法都接受一个 com.fasterxml.jackson.core.util.DefaultPrettyPrinter.Indenter 接口的实现。Jackson 提供了一个默认实现 DefaultIndenter,它允许我们指定缩进字符串(例如两个空格 ” “)和换行符(例如系统默认换行符 DefaultIndenter.SYS_LF)。

Qoder Qoder

阿里巴巴推出的AI编程工具

Qoder 270 查看详情 Qoder

import com.fasterxml.jackson.core.util.DefaultIndenter;import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;// 创建一个DefaultPrettyPrinter实例DefaultPrettyPrinter printer = new DefaultPrettyPrinter();// 配置对象内部的缩进和换行// 使用两个空格作为缩进,并使用系统默认的换行符printer.indentObjectsWith(new DefaultIndenter("  ", DefaultIndenter.SYS_LF));// 配置数组内部的缩进和换行// 同理,使用两个空格作为缩进,并使用系统默认的换行符printer.indentArraysWith(new DefaultIndenter("  ", DefaultIndenter.SYS_LF));

2. 精细控制空格

除了缩进和换行,DefaultPrettyPrinter 还提供了其他方法来控制键值对和数组元素之间的空格:

setSpacesInObjectEntries(boolean): 控制对象中键和值之间的冒号 : 两侧是否添加空格。默认值为 true(”key” : “value”)。设置为 false 可以得到 “key”:”value”。setSpacesInArrayValues(boolean): 控制数组值之间是否添加空格。默认值为 true([ value1, value2 ])。设置为 false 可以得到 [value1,value2]。

针对我们之前提到的 key : value 和 [ ] 的问题,我们可以这样配置:

// ... (接上一步的 printer 配置)// 设置对象键值对之间不带空格,实现 "key":"value"printer.setSpacesInObjectEntries(false);// 注意:DefaultPrettyPrinter 默认情况下,即使设置了 setSpacesInArrayValues(false),// 对于空数组,仍可能输出 "[ ]" 而非 "[]"。// 如果需要严格的 "[]",可能需要自定义 DefaultPrettyPrinter 子类并重写相关方法。// 但对于大多数情况,上述缩进配置已能满足大部分美化需求。

3. 将定制打印器应用于 ObjectMapper

配置好 DefaultPrettyPrinter 后,需要将其告知 ObjectMapper。有两种主要方式:

全局设置: 使用 mapper.setDefaultPrettyPrinter(printer) 将其设置为 ObjectMapper 的默认美化打印器。按需设置: 通过 mapper.writerWithDefaultPrettyPrinter() 获取一个 ObjectWriter 实例,这个 ObjectWriter 将使用 ObjectMapper 当前配置的默认美化打印器进行序列化。这是推荐的做法,因为它提供了更灵活的链式调用。

import com.fasterxml.jackson.databind.ObjectMapper;import java.io.File;import java.util.ArrayList;import java.util.List;// ... (接上一步的 printer 配置)ObjectMapper mapper = new ObjectMapper();// 将定制的打印器设置为默认mapper.setDefaultPrettyPrinter(printer);// 最终进行序列化// 假设 res 是一个 ArrayListArrayList res = manager.getRes(); mapper    .writerWithDefaultPrettyPrinter() // 使用配置好的默认美化打印器    .writeValue(new File(args[1]), res);

完整示例

为了更好地演示,我们定义一个简单的 POJO ActionOutput:

import java.util.List;public class ActionOutput {    private String key1;    private List key2;    private String key3;    // All-args constructor    public ActionOutput(String key1, List key2, String key3) {        this.key1 = key1;        this.key2 = key2;        this.key3 = key3;    }    // Getters (省略 setters 和默认构造函数,根据实际需要添加)    public String getKey1() {        return key1;    }    public List getKey2() {        return key2;    }    public String getKey3() {        return key3;    }}

现在,结合上述配置和 POJO,进行序列化:

import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.core.util.DefaultIndenter;import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;import java.io.IOException;import java.util.List;public class JsonPrettyPrintDemo {    public static void main(String[] args) throws IOException {        // 1. 创建并配置 DefaultPrettyPrinter        DefaultPrettyPrinter printer = new DefaultPrettyPrinter();        printer.indentObjectsWith(new DefaultIndenter("  ", DefaultIndenter.SYS_LF));        printer.indentArraysWith(new DefaultIndenter("  ", DefaultIndenter.SYS_LF));        printer.setSpacesInObjectEntries(false); // 键值对之间不带空格        // 2. 创建 ObjectMapper 并设置定制的打印器        ObjectMapper mapper = new ObjectMapper();        mapper.setDefaultPrettyPrinter(printer);        // 3. 准备数据        List actions = List.of(            new ActionOutput("value1", List.of(), null),            new ActionOutput("value2", List.of("item1"), "some_value")        );        // 4. 执行序列化并打印到控制台        String jsonRes = mapper            .writerWithDefaultPrettyPrinter()            .writeValueAsString(actions);        System.out.println(jsonRes);    }}

运行上述代码,将得到以下格式的 JSON 输出:

[  {    "key1":"value1",    "key2":[],    "key3":null  },  {    "key1":"value2",    "key2":[      "item1"    ],    "key3":"some_value"  }]

可以看到,[ 和 { 后都正确换行,键值对之间没有多余空格 (“key1″:”value1”)。对于空数组 key2:[],DefaultPrettyPrinter 在这里也正确输出了 [] 而非 [ ],这表明 setSpacesInObjectEntries(false) 和 indentArraysWith() 的组合在某些情况下可以达到预期。

注意事项与总结

灵活性: DefaultPrettyPrinter 提供了高度的灵活性,足以满足绝大多数 JSON 美化输出的需求。通过其各种 set 方法,可以控制缩进字符、换行符、键值对空格、数组元素空格等。空数组的特殊处理: 尽管 setSpacesInArrayValues(false) 影响数组内部元素间的空格,但对于空数组 [] 和 [ ] 的严格控制,有时可能需要更深入地研究 DefaultPrettyPrinter 的源代码或考虑继承它并重写相关方法来微调。在上述示例中,默认行为已满足 [] 的输出。性能考量: 美化输出会增加 JSON 字符串的体积,并可能略微增加序列化时间。在对性能有严格要求的场景下(例如高吞吐量的 API 响应),通常会禁用美化输出。一致性: 在团队开发中,建议统一 JSON 美化输出的配置,以确保代码库中 JSON 格式的一致性。

通过定制 DefaultPrettyPrinter,开发者可以完全掌控 Jackson ObjectMapper 的 JSON 美化输出行为,从而生成符合特定规范或更易读的 JSON 数据。

以上就是Jackson ObjectMapper 精确控制 JSON 格式化输出的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/959533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 18:34:25
下一篇 2025年12月1日 18:34:46

相关推荐

  • php标准类型包括哪些

    PHP 的标准类型有:整数、浮点数、布尔值、字符串、数组、对象和 NULL。 PHP 标准类型: PHP 的标准类型包括以下几种: 1. 数字类型 整数 (int):整数类型,可以用常规的十进制数字表示。例如:100, -20浮点数 (float/double):浮点数类型,可以用小数点表示。例如:…

    2025年12月12日
    000
  • php缓存框架有哪些

    答案:使用 PHP 缓存框架可显著提升 PHP 应用性能,通过存储经常访问的数据减少数据库查询和文件 I/O 操作。详情:APC:opcode 缓存框架,提升 PHP 运行速度。Memcached:分布式内存缓存系统,适用于处理大量缓存数据。Redis:键值对内存数据存储,支持多种数据结构,适用于高…

    2025年12月12日
    000
  • php有哪些基本变量

    PHP 中的基本变量类型包括:整型、浮点型、字符串、布尔型、数组、对象、资源和空(NULL)。它们分别用于表示整数、带小数点的数字、文本数据、真假值、数据集合、数据实体、对外部资源的指针和没有值或未知值。 PHP 中的基本变量 PHP 中的基本变量类型包括: 整型(integer)浮点型(float…

    2025年12月12日
    000
  • php中json如何写数组

    要将 PHP 数组编码为 JSON 字符串,请使用 json_encode() 函数,该函数将数组编码为包含键值对的 JSON 对象。它会转义特殊字符,并可以递归地处理嵌套数组。其他选项包括 JSON_HEX_TAG、JSON_HEX_QUOT、JSON_HEX_AMP、JSON_HEX_APOS …

    2025年12月12日
    000
  • php 如何替换数组下标

    PHP 中替换数组下标的方法:采用 array_flip() 函数交换键值对。利用 array_combine() 函数重新创建数组,以一个数组作为键,另一数组作为值。使用 array_replace() 函数合并数组,用后一个数组中的键值对替换前一个数组中的键值对。 如何替换 PHP 数组下标 P…

    2025年12月12日
    000
  • 什么是ETF杠杆代币?如何交易?Gate交易ETF杠杆代币的图文教程(APP/网页端)

    币安 Binance OKX 欧易 ️ 火币 Huobi️ 什么是 ETF 杠杆代币? etf 杠杆代币是一种借助期货合约等衍生工具构建的指数型产品,旨在精准追踪某一数字资产现货价格变动,并按固定倍数(如3倍、5倍)放大其涨跌幅。该类产品将杠杆功能内嵌于代币结构中,用户无需缴纳保证金、不面临强制平仓…

    2025年12月12日 好文分享
    000
  • 欧易OKX安卓手机下载安装完整教学

    欧易是一款全球知名的数字资产交易平台,凭借卓越的安全防护体系、全面多元的交易产品以及简洁高效的交互体验,已获得数百万用户的广泛认可。对于使用安卓系统的用户来说,通过官方途径准确获取并安装最新版欧易okx移动应用,是守护数字资产安全、便捷接入区块链生态服务的关键起点。本文将为您呈现一份细致入微的“欧易…

    2025年12月12日 好文分享
    000
  • MultiverseX(EGLD)币是什么?EGLD未来走势及投资价值全解析

    multiversex (egld) 曾是一个备受瞩目的 layer 1 项目。熟悉其前身 elrond 的投资者或许还记得,当时人们对它寄予厚望,认为其分片技术能够显着提升 tps,并拥有快速的网络架构。然而,从 egld 目前的股价来看,尽管它仍然保持着一定的市场地位,但并未达到最初的预期。这在…

    2025年12月12日
    100
  • Humanity Protocol(H)币是什么?如何购买?H代币经济与价格预测

    当 ai 已经聪明到可以模仿你的声音、生成你的头像,甚至冒充你与他人对话时,一个问题开始频繁出现:在数字世界里,我们要如何证明“我真的在这里”?就在这样的时代背景下,humanity protocol 站了出来,而且恰逢其时。它给出的方案既直观又突破传统,不依赖容易伪造的密码、验证码或身份文件,而是…

    2025年12月12日 好文分享
    100
  • 什么是PIEVERSE币?值得购买吗?PIEVERSE主要功能、运作方式及代币经济学

    Binance币安 欧易OKX ️ Huobi火币️ 摘要 Pieverse旨在重新定义数字经济中的时间估值和货币化。总供应量为10亿枚PIEVERSE代币,目前流通量为1.75亿枚。24小时交易量为9,654.2619万美元,仅在CoinEx上交易。主要功能包括质押、治理和生产力目标奖励。最近的合…

    2025年12月12日
    000
  • 什么是Theta Fuel (TFUEL)币?TFUEL代币经济学、未来展望及购买指南

    theta fuel (tfuel) 是 theta 平台上的支付加密货币,theta 是一个基于区块链的视频分享平台。19 日,theta fuel (tfuel) 在 upbit贪婪与恐惧指数中位列第一(贪婪指数) ,得分为 72 分,引起了市场参与者的广泛关注。 Binance币安 欧易OKX…

    2025年12月12日 好文分享
    100
  • 什么是柚子币(EOS)?EOS价格预测2025-2030

    柚子币(eos)是专为支撑大规模去中心化应用(dapps)而构建的区块链平台,采用委托权益证明(dpos)共识机制与零手续费的资源分配模型,致力于实现超高吞吐量与极致用户体验;其2025至2030年间的价格演化路径,将深度绑定于核心技术迭代、生态扩张节奏及行业竞争格局变化,虽具备显著增长潜质,但也需…

    2025年12月12日
    000
  • 币安Alpha代币的反向订单是什么?如何下币安Alpha反向订单?

    Binance币安 欧易OKX ️ Huobi火币️ 什么是币安Alpha代币的反向委托? 反向委托属于一种“一单触发另一单”(One-Triggers-Another,OTO)类型的智能订单机制。即当主订单满足成交条件并完成执行后,系统将自动创建并挂出一个方向相反的子订单。该功能支持交易者同步部署…

    2025年12月12日 好文分享
    100
  • 什么是以太坊Fusaka升级?2025年以太坊扩容的完整新手指南

    Fusaka升级是2025年以太坊扩容关键步骤,核心为引入Verkle树替代默克尔·帕特里夏树,实现无状态和增强Layer 2支持,降低节点硬件门槛并提升去中心化。 以太坊fusaka升级是继prague/electra之后的一个重要规划,其核心是引入verkle树以优化状态管理。这是2025年以太…

    2025年12月12日
    000
  • 如何从币安交易所提币至imKey?提币操作步骤和注意事项

    从币安提币至imKey需四步:一、在imKey App中选择资产并复制收款地址;二、币安提现页粘贴地址并选对应资产;三、严格匹配提币网络与地址链类型;四、完成多重安全验证后查收到账。 从币安交易所提币至imkey硬件设备,核心是先在imkey应用内获取正确的收款地址,然后在币安平台填写该地址并选择匹…

    2025年12月12日
    000
  • MOON币是什么?值得投资吗?MOON币价格预测指南

    MOON币是Reddit r/CryptoCurrency社区的ERC-20积分代币,基于Arbitrum Nova链,用于奖励Karma贡献、打赏、会员购买及治理投票;其价值取决于社区活跃度、代币经济、治理参与和流动性,并需结合Karma分配比率、链上数据与社交媒体情绪综合分析。 moon币是re…

    2025年12月12日
    000
  • 山寨币ETF扎堆上市,币价却在下跌,ETF获批还能算利好吗?

    山寨币etf扎堆上市,币价却持续走弱,etf获批是否仍具长期支撑力? Binance币安 欧易OKX ️ Huobi火币️ 一、价格承压:短期情绪主导下的“利好兑现即利空” 10月下旬至11月,DOGE、XRP、Solana(SOL)、Litecoin(LTC)、Hedera(HBAR)及Chain…

    2025年12月12日
    000
  • 一文详细了解韩国推动在12月10日截止日期前制定稳定币草案

    Binance币安 欧易OKX ️ Huobi火币️ 韩国议员为稳定币监管草案设定12月10日最后期限,警告若监管机构未按时提交,将自行推动立法。 韩国执政党向金融监管机构发出“最后通牒”,要求其在12月10日前提交稳定币监管框架草案。据《每日经济新闻》周一报道,民主党议员康俊贤表示:“如果政府未能…

    2025年12月12日
    000
  • 什么是加密资产?有哪些类型?监管情况如何?

    我们早已习惯将资金与贵重物品托付给银行或政府登记系统进行保管。然而,近年来一种崭新的资产形态悄然兴起——它仅存在于互联网之中,且以一种前所未有的方式被管理:去中心化、公开可验、自主可控。这便是加密资产(crypto assets)。 Binance币安 欧易OKX ️ Huobi火币️ 要真正理解它…

    2025年12月12日
    000
  • Daeler Node (DNODE) 币是什么?如何运作?2026–2030年价格预测

    加密货币和人工智能的世界正在快速演变,dealer node (dnode) 已成为最令人瞩目的新基础设施解决方案之一。 Binance币安 欧易OKX ️ Huobi火币️ 与其提供另一个区块链、代币或模糊承诺的L2,DNODE更专注于一些非常实用的东西:去中心化运算,这开发者和自主代理可以立即使…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信