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

Dmi*_*sky 17 java jackson

我真的在努力解决我在解决这个问题时所感受到的复杂程度.正如标题所说:创建一个ObjectMapper拥有4个空间的杰克逊的简单方法是什么PrettyPrinter

加分点:我如何修改现有的 ObjectMapper 4个空格?

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

objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
Run Code Online (Sandbox Code Playgroud)

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

was*_*ren 19

我不确定这是否是最简单的方法,但是...您可以使用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<String, Object> 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);
Run Code Online (Sandbox Code Playgroud)

输出将是:

{
    "foo" : [
        "a",
        "b",
        "c"
    ]
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`mapper.setDefaultPrettyPrinter(printer);`使此答案中的自定义打印机成为对象映射器的默认打印机.您仍然需要通过`mapper.enable(SerializationFeature.INDENT_OUTPUT)`启用缩进. (3认同)
  • `打印机 = Printer.withoutSpacesInObjectEntries(); // 默认是 withSpacesInObjectEntries()` 但它会删除所有空格:`"foo":[` 所以我只会转换我的最终字符串。期望结果结构始终为 `"foo" : [`,我使用 `result.replace("\" : \"", "\": \"")` 文档[此处](https://static. javadoc.io/com.fasterxml.jackson.core/jackson-core/2.6.1/deprecated-list.html) (3认同)
  • @wassgren 有没有办法删除每个元素冒号前的空格?即`"foo" 中冒号前的空格: [` ? (2认同)

Ben*_*yaa 8

做到这一点非常简单,您不需要实现任何接口/抽象类。仅创建一个新打印机并将其用作映射器编写器的参数:

    ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
    DefaultPrettyPrinter printer = new DefaultPrettyPrinter().withObjectIndenter(new DefaultIndenter("    ", "\n"));
    String json = mapper.writer(printer).writeValueAsString(result);
Run Code Online (Sandbox Code Playgroud)