Jackson - 将自定义 PrettyPrinter 与自定义 JsonSerializer 结合使用
Jackson - Using custom PrettyPrinter with custom JsonSerializer
我正在使用 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);
但这并没有调用我的自定义打印机。
原因是调用了 writer returns 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"
}
其中第一行使用映射器,而第二行使用编写器。
干杯,
阿图尔
有时,根据您想要实现的目标,您可以使用 DefaultPrettyPrinter
and just customize the Indenter
,如下所示:
DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
Indenter indenter = new CustomSpaceIndenter();
printer.indentObjectsWith(indenter); // Indent JSON objects
printer.indentArraysWith(indenter); // Indent JSON arrays
有一个相关的问题:
我正在使用 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);
但这并没有调用我的自定义打印机。
原因是调用了 writer returns 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"
}
其中第一行使用映射器,而第二行使用编写器。
干杯,
阿图尔
有时,根据您想要实现的目标,您可以使用 DefaultPrettyPrinter
and just customize the Indenter
,如下所示:
DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
Indenter indenter = new CustomSpaceIndenter();
printer.indentObjectsWith(indenter); // Indent JSON objects
printer.indentArraysWith(indenter); // Indent JSON arrays
有一个相关的问题: