java - Jackson JSON 反序列化 - 合成列表 getter

标签 java json jackson

我正在尝试使用 Jackson 反序列化一些最初使用 Jackson 创建的 JSON。该模型有一个合成列表 getter :

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

列表不是私有(private)成员,而是动态生成的。现在这个序列化很好,但在反序列化中使用 getTeams,大概是因为 Jackson 看到一个带有可变列表的 getter 并认为它可以将它用作 setter。 getTeams 的内部依赖于 Jackson 尚未填充的其他字段。其结果是 NPE,即我认为订单是这里的问题之一,但不是我想要解决的问题。

所以,我想做的是注释 getTeams,这样它就不会用作 setter,而是用作 getter。这可能吗?有什么建议吗?

最佳答案

禁用 DeserializationConfig.Feature.USE_GETTERS_AS_SETTERS .

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

使用静态导入使这一行更短。

或者,如果您想要一个注解只为这个属性配置一些东西,而不是像上面那样指定全局设置,那么将一些东西标记为“teams”的 setter 。

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";
}

关于java - Jackson JSON 反序列化 - 合成列表 getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6600012/

相关文章:

java - 使用 JSONObject Java 类的静态 getNames 方法时,Eclipse 中出现语法错误

java - Jackson 将 XML 中的平面数组反序列化为 Pojo 列表

java - 如何在 Jackson Mapper 的帮助下使用单个 JSON 文件创建多种类型的 Java 对象?

java - 无法将 ksoap2 导入 Android Studio

java - 渲染针对调色板有限的设备的 2D 图像

java - 当 JSON 以 [ 开头时,ReSTLet 抛出错误

java - AWS SqsListener 使用 Jackson 反序列化自定义对象

java - 将 Java 8 Lambda 与注解相结合

Java多客户端服务器应用程序-如何组织套接字

javascript - 当尝试迭代我的 json 时,我变得不确定