2016-09-16 98 views
1

我正在使用Jackson v2.8.2將JSON序列化爲文件。Jackson - 將自定義PrettyPrinter與自定義JsonSerializer一起使用

我已經創建了一個自定義序列化器並實現了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); 

但那不是我的調用自定義打印機。

回答

2

原因是編寫器的調用返回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" 
} 

其中第一行使用映射器,而第二打印使用作家。

乾杯,

阿圖爾

+0

如果我按照您的建議更改代碼,它不會編譯 - 類型不匹配:cann不要從ObjectWriter轉換爲ObjectMapper'。 – ksl

+0

@ksl你是對的。我道歉,我更新了我的答案。您必須將作者分配給一個變量並使用該變量 – pandaadb

+1

謝謝,這很有用。還要注意''mapper.setDefaultPrettyPrinter(new MyPrettyPrinter())'也適用。我偶然發現了這裏 - https://github.com/FasterXML/jackson-databind/issues/689。 – ksl

1

有時候,這取決於你想要達到的目標,你可以使用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

相關問題