在Jackson ObjectMapper上配置缩进间距的最简单方法是什么?

我真的在努力解决这个问题时所感受到的复杂程度。 正如标题所说: 使用4空间PrettyPrinter创建Jackson ObjectMapper的简单方法是什么?

加分点:如何修改现有的 ObjectMapper以使其打印4个空格?

通过我的研究,我发现最简单的方法是启用漂亮的打印通常是在mapper上设置INDENT_OUTPUT

 objectMapper.enable(SerializationFeature.INDENT_OUTPUT); 

但是,这只启用DefaultPrettyPrinter ,它有2个缩进空格。 我想4.为了做到这一点,我似乎必须构建自己的ObjectMapper ,为JsonFactory提供一个JsonGenerator ,它有一个4个空格的PrettyPrinter 。 对于在其他平台上如此简单的东西来说,这太过激烈了。 请告诉我有一个更简单的方法。

我不确定这是否是最简单的方法但是……您可以将ObjectMapper与自定义打印机一起使用。 如果修改缩进行为,则可以使用DefaultPrettyPrinter

 // Create the mapper ObjectMapper mapper = new ObjectMapper(); // Setup a pretty printer with an indenter (indenter has 4 spaces in this case) DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter(" ", DefaultIndenter.SYS_LF); DefaultPrettyPrinter printer = new DefaultPrettyPrinter(); printer.indentObjectsWith(indenter); printer.indentArraysWith(indenter); // Some object to serialize Map value = new HashMap<>(); value.put("foo", Arrays.asList("a", "b", "c")); // Serialize it using the custom printer String json = mapper.writer(printer).writeValueAsString(value); // Print it System.out.println(json); 

输出将是:

 { "foo" : [ "a", "b", "c" ] } 

如果您打算像我一样编写多个对象,那么在IntelliJ中运行的JUnit测试中获得JSON比较(它有一个非常好的多行比较工具):

 // could likely be simplified to `new ObjectMapper().writer(new DefaultPrettyPrinter())` ObjectWriter writer = new ObjectMapper() .setDefaultPrettyPrinter(new DefaultPrettyPrinter()) .writerWithDefaultPrettyPrinter(); try { String expected = writer.writeValueAsString(testCase.getThing()); String actual = writer.writeValueAsString(actual.getThing()); assertEquals(expected, actual); } catch (JsonProcessingException e) { fail("JSON exception: " + e.toString()); }