티스토리 뷰

SnakeYAML에서 yaml.load()실행시, 값이 "2019-01-01T00:00:00"인 경우 java.util.Date로 만들어지게 된다. 출력할 때 원하는 데이터타입으로 변경해도 되지만,  load()실행시 원하는 데이터타입으로 만들어지도록 설정하는 방법을 알아본다. 내가 원하는 데이터타입은 LocalDateTime이다.


공식문서 중에 데이터 타입과 관련된 부분은

https://bitbucket.org/asomov/snakeyaml/wiki/Documentation#markdown-header-implicit-types

인데, Date를 LocalDateTime으로 바꾸는 방법은 못 찾았다.


그래서 그냥 코드를 찾아 들어가봤다.


Yaml 기본 생성자를 보면 Constructor, LoaderOptions, Representer, DumperOption, Resolver를 기본 생성자로 넘겨준다.

Loader는 그냥 로더고, Dumper는 Yaml인스턴스를 만들어주는 용도라서 아마도 Constructor, Representer, Resolver중에 하나일 것 같다.


Constructor부터 찾아들어가본다.

주석에  Construct a custom Java instance.란다. 아마도 여기 같다.

생성자에서는 yamlConstructors와 yamlClassConstructors에 construct 생성하여 넣어주고 있다.


Constructor는 SafeConstructor를 상속받는다. SafeConstructor의 코드도 봐본다.

주석에 Construct standard Java classes라고 써있다. 이곳이다.

코드 중에 this.yamlConstructors.put(Tag.TIMESTAMP, new ConstructYamlTimestamp())가 내가 원하는 코드이다.


ConstructYamlTimestamp클래스를 확인해보면

Calendar를 만들어 Date로 리턴하는 것을 확인할 수 있다.

yamlConstructors에 Tag.TIMESTAMP에 대해 처리하는 ConstructYamlTimestamp대신 내 코드를 넣으면 될 것 같다.


최종코드이다.

문자열에 대해서 이미 기존코드가 체크를 해주고 있기 때문에 아무런 처리 없이 바로 파싱해서 리턴해버렸다.