2011-07-06 2 views
3

Jackson을 사용하여 원래 만든 일부 JSON을 deserialize하기 위해 Jackson을 사용하려고합니다. 목록 개인 회원이 아니라 즉석에서 생성 된 곳Jackson JSON deserialization - synthetic list getter

public List<Team> getTeams() { 
    // create the teams list 
} 

:이 모델은 합성 목록 게터 있습니다. 이제는 serialize가 잘되지만, deserialization에서는 getTeams를 사용합니다. 아마도 Jackson은 변경 가능한 목록을 가진 getter를보고 setter로 사용할 수 있다고 생각하기 때문입니다. getTeams의 내부는 Jackson이 아직 채워지지 않은 다른 필드에 의존합니다. 그 결과 NPE입니다. 즉 주문은 여기 문제 중 하나이지만 해결하고 싶지는 않습니다.

그럼 getTeams에 주석을 달아서 설정 도구로 사용하지 말고 은 게터로 사용되는입니다. 이것이 가능한가? 어떤 제안?

답변

4

비활성화 DeserializationConfig.Feature.USE_GETTERS_AS_SETTERS.

mapper.configure(DeserializationConfig.Feature.USE_GETTERS_AS_SETTERS, false); 

정적 가져 오기를 사용하면이 줄을 더 짧게 만들 수 있습니다.

또는 주석에이 속성의 구성 만 지정하고 위와 같이 전역 설정을 지정하지 않으려면 "팀"의 설정자로 무엇인가를 표시하십시오.

public class Foo 
{ 
    @JsonSetter("teams") 
    public void asdf(List<Team> teams) 
    { 
    System.out.println("hurray!"); 
    } 

    public List<Team> getTeams() 
    { 
    // generate unmodifiable list, to fail if change attempted 
    return Arrays.asList(new Team()); 
    } 

    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper(); 
    String fooJson = mapper.writeValueAsString(new Foo()); 
    System.out.println(fooJson); 
    // output: {"teams":[{"name":"A"}]} 

    // throws exception, without @JsonSetter("teams") annotation 
    Foo fooCopy = mapper.readValue(fooJson, Foo.class); 
    // output: hurray! 
    } 
} 

class Team 
{ 
    public String name = "A"; 
} 
+0

맞음 : @JsonSetter가 @JsonSetter 대신 작동한다는 점에 유의하십시오. @JsonSetter는 서명으로 인해 게터가 될 수 없으므로 작동합니다. – StaxMan

+0

팁 주셔서 감사합니다. 나는 그 구성 설정을 놓쳤으며,이 인스턴스에서 이것을 사용하게되어 기쁩니다. 또한 @JsonSetter 또는 @JsonProperty를 사용하여 setter 경로 변경에 대해 알아두면 좋습니다. – David

관련 문제