2016-09-16 2 views
1

Jackson v2.8.2를 사용하여 JSON을 파일에 serialize합니다.Jackson - 사용자 정의 JsonSerializer로 사용자 정의 PrettyPrinter 사용

필자는 사용자 지정 serializer를 만들고 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); 
    } 

그 방법, 당신은 당신의 코드를 변경해야 : 올바른 작가를 사용되도록 myWriter에

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

참고 할당을 호출 할 때 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

관련 문제