You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Jackson生成符合第三方REST服务要求的JSON美化格式?

当然可以配置Jackson生成符合第三方服务要求的JSON格式!我完全理解你这种“对方服务格式太苛刻但自己没法干预”的无奈,下面给你两种可行的方案,都是基于Jackson原生API实现的,不用额外找第三方工具:

方案1:通过调整序列化特性快速实现

如果你的需求只是保留必要空格(冒号后、逗号后、数组/对象括号前后的空格)但完全去掉换行缩进,可以直接通过配置ObjectMapper的序列化特性和JSON生成器参数来实现:

ObjectMapper mapper = new ObjectMapper();

// 关闭默认的美化缩进输出
mapper.disable(SerializationFeature.INDENT_OUTPUT);

// 配置JSON生成器的空格规则:
// 冒号后加空格,逗号后加空格
mapper.configure(JsonGenerator.Feature.WRITE_SPACE_AFTER_COLON, true);
mapper.configure(JsonGenerator.Feature.WRITE_SPACE_AFTER_COMMA, true);
// 冒号前、逗号前不加空格
mapper.configure(JsonGenerator.Feature.WRITE_SPACE_BEFORE_COLON, false);
mapper.configure(JsonGenerator.Feature.WRITE_SPACE_BEFORE_COMMA, false);

用这个配置生成的JSON格式就是:

[ { "email": "foo.bar1@domain.com" }, { "email": "foo.bar2@domain.com" } ]

完全符合第三方服务的要求。

方案2:自定义PrettyPrinter实现精准格式控制

如果需要更精细化的格式调整(比如对数组/对象的括号前后空格有严格要求),可以继承Jackson自带的DefaultPrettyPrinter来实现自定义格式:

public class CustomCompactPrettyPrinter extends DefaultPrettyPrinter {
    public CustomCompactPrettyPrinter() {
        super();
        // 设置对象键值对的分隔符为 ": "(冒号后带空格)
        _objectFieldValueSeparatorWithSpaces = ": ";
        // 设置数组元素的分隔符为 ", "(逗号后带空格)
        _arrayValueSeparatorWithSpaces = ", ";
    }

    @Override
    public void writeStartArray(JsonGenerator g) throws IOException {
        // 数组开头输出 "[ " 而不是默认的 "["
        g.writeRaw("[ ");
    }

    @Override
    public void writeEndArray(JsonGenerator g, int nrOfValues) throws IOException {
        // 数组结尾输出 " ]" 而不是默认的 "]"
        g.writeRaw(" ]");
    }

    @Override
    public void writeStartObject(JsonGenerator g) throws IOException {
        // 对象开头输出 "{ " 而不是默认的 "{"
        g.writeRaw("{ ");
    }

    @Override
    public void writeEndObject(JsonGenerator g, int nrOfEntries) throws IOException {
        // 对象结尾输出 " }" 而不是默认的 "}"
        g.writeRaw(" }");
    }
}

使用时直接把自定义Printer设置给ObjectMapper即可:

ObjectMapper mapper = new ObjectMapper();
mapper.setPrettyPrinter(new CustomCompactPrettyPrinter());

// 序列化你的列表对象
List<EmailDto> emails = Arrays.asList(
    new EmailDto("foo.bar1@domain.com"),
    new EmailDto("foo.bar2@domain.com")
);
String json = mapper.writeValueAsString(emails);

这个方案能完全精准地控制JSON的格式细节,确保和第三方服务要求的格式完全一致。

需要注意的是,两种方案都不需要开启Jackson的INDENT_OUTPUT特性(也就是默认的美化打印),因为我们要的是无换行但保留必要空格的紧凑格式。

内容的提问来源于stack exchange,提问作者Marged

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:47:31