2

我正在使用 Jackson v2.8.2 将 JSON 序列化为文件。

我创建了一个自定义序列化程序并实现了serialize根据需要自定义 JSON 输出的方法。

我正在调用序列化程序,如下所示:

// myClass is the object I want to serialize

SimpleModule module = new SimpleModule();
module.addSerializer(MyClass.class, new MySerializer());

ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(module);

try 
{
    mapper.writeValue(new File("json.txt"), myClass);
}

catch (JsonProcessingException e) 
{
    ...
}

JSON 文件已创建,内容看起来不错。

该文件是根据格式化的,DefaultPrettyPrinter但我想使用我自己的自定义PrettyPrinter,我已经实现了。

我怎么做?

我尝试了以下方法:

MyPrettyPrinter myPrettyPrinter = new MyPrettyPrinter();
mapper.writer(myPrettyPrinter);
mapper.writeValue(new File("json.txt"), myClass);

但这并没有调用我的自定义打印机。

4

2 回答 2

5

有时,根据您想要实现的目标,您可以使用DefaultPrettyPrinter并且只自定义Indenter,如下所示:

DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
Indenter indenter = new CustomSpaceIndenter();
printer.indentObjectsWith(indenter); // Indent JSON objects
printer.indentArraysWith(indenter);  // Indent JSON arrays

有一个相关的问题:Serialize JsonNode to a very specific JSON format in Jackson

于 2016-09-16T09:45:15.800 回答
3

原因是调用 writer 返回了 ObjectWriter 的一个新实例。事实上,ObjectMapper 有很多工厂方法可以构造新的对象供您使用。

来自 ObjectMapper 的源代码:

/**
     * Factory method for constructing {@link ObjectWriter} that will
     * serialize objects using specified pretty printer for indentation
     * (or if null, no pretty printer)
     */
    public ObjectWriter writer(PrettyPrinter pp) {
        if (pp == null) { // need to use a marker to indicate explicit disabling of pp
            pp = ObjectWriter.NULL_PRETTY_PRINTER;
        }
        return _newWriter(getSerializationConfig(), /*root type*/ null, pp);
    }

因此,对您而言,这意味着您应该将代码更改为:

MyPrettyPrinter myPrettyPrinter = new MyPrettyPrinter();
ObjectWriter myWriter = mapper.writer(myPrettyPrinter);
myWriter.writeValue(new File("json.txt"), myClass);

请注意对 myWriter 的分配,以便在调用时使用正确的编写器writeValue

这是一个使用 ObjectMapper 和默认漂亮打印机的示例:

public class OMTest {
    public static void main(String[] args) throws IOException {
        // test string
        String json = "  {\"a\" : \"b\", \"c\" : \"d\" } ";
        // mapper
        ObjectMapper mapper = new ObjectMapper();
        // json tree
        JsonNode tree = mapper.readTree(json);
        // the objectWriter assigned with a pretty printer
        ObjectWriter myWriter = mapper.writer(new DefaultPrettyPrinter());
        // print without pretty printer (using mapper)
        System.out.println(mapper.writeValueAsString(tree));
        System.out.println();
        // print with writer (using the pretty printer) 
        System.out.println(myWriter.writeValueAsString(tree));
    }
}

这打印:

{"a":"b","c":"d"}

{
  "a" : "b",
  "c" : "d"
}

第一行使用映射器,而第二行使用编写器。

干杯,

阿图尔

于 2016-09-16T09:11:04.000 回答