2011-07-06 38 views
3

我试图用杰克逊反序列化最初使用杰克逊创建的一些JSON。该模型具有合成列表获取器:杰克逊JSON反序列化 - 合成列表获取器

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

其中该列表不是私人成员,而是在飞行中生成的。现在,这个序列很好,但是在反序列化中使用了getTeams,可能是因为Jackson看到一个带有可变列表的getter,并认为它可以用它作为setter。 getTeams的内部依赖于杰克逊尚未填充的其他字段。其结果是一个NPE,即我认为秩序是这里的问题之一,但不是我想解决的问题之一。

因此,我想要做的是注释getTeams,以便它永远不会用作setter,但用作getter。这可能吗?有什么建议么?

回答

4

Disable 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

正确:也注意到,@JsonProperty也将工作,而不是@JsonSetter,因为它不可能是一个getter由于签名。 – StaxMan

+0

感谢您的提示。我错过了这个配置设置,很高兴在这个例子中使用它。使用@JsonSetter或@JsonProperty重新路由设置器也很好 – David