杰克逊映射器后期构造

2022-09-01 02:08:48

我正在使用Jackson将一些JSON反序列化为Java类,我们将称之为。我想向类中添加一些逻辑,以便在加载字段后修复一些数据。例如,一些早期的JSON文件曾经使用“”标志而不是“gender”falg,所以如果设置了性标志但没有设置性别标志,我想将性别字段的值设置为性别字段的值。ObjectMapperPlayerDataPlayerData

有没有某种@PostConstruct或@AfterLoad注释可以附加到方法上?或者也许是我可以实现的接口?我没有在文档中注意到一个,但它似乎是一个明显的功能。


答案 1

通过评论中的链接找到了这个(图片来源:fedor.belov)。这似乎允许您运行代码发布构造。

为那些通过 http://jira.codehaus.org/browse/JACKSON-645http://jira.codehaus.org/browse/JACKSON-538 最终来到这里并正在寻找在反序列化程序完成后调用的方法的人添加注释。我能够通过包含注释和编写使用与输入和输出相同的类的转换器来实现所需的效果。

@JsonDeserialize(converter=MyClassSanitizer.class)  // invoked after class is fully deserialized
public class MyClass {
    public String field1;
}

import com.fasterxml.jackson.databind.util.StdConverter;
public class MyClassSanitizer extends StdConverter<MyClass,MyClass> {
  @Override
  public MyClass convert(MyClass var1) {
    var1.field1 = munge(var1.field1);
    return var1;
  }
}

答案 2

如果您不使用 ,则 Jackson 将使用 setter 和 getter 方法来设置字段。@JsonCreator

因此,如果您定义以下方法,假设您有 和 枚举:SexGender

@JsonProperty("sex")
public void setSex(final Sex sex) {
  this.sex = sex;
  if (gender == null) {
    gender = (sex == Sex.WOMAN) ? Gender.WOMAN : Gender.MAN;
  }
}

@JsonProperty("gender")
public void setGender(final Gender gender) {
  this.gender = gender;
  if (sex == null) {
    sex = (gender == Gender.WOMAN) ? Sex.WOMAN : Sex.MAN;
  }
}

它会工作。

更新:您可以在此处找到杰克逊图书馆的所有注释。

更新2:其他解决方案:

class Example {
  private final Sex sex;
  private final Gender gender;

  @JsonCreator
  public Example(@JsonProperty("sex") final Sex sex) {
    super();
    this.sex = sex;
    this.gender = getGenderBySex(sex)
  }

  @JsonFactory
  public static Example createExample(@JsonProperty("gender") final Gender gender) {
    return new Example(getSexByGender(gender));
  }

  private static Sex getSexByGender(final Gender) {
    return (gender == Gender.WOMAN) ? Sex.WOMAN : Sex.MAN;
  }

  private static Gender getGenderBySex(final Sex) {
    return (sex == Sex.WOMAN) ? Gender.WOMAN : Gender.MAN;
  }

}

推荐