在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()); }