java - JSON Jackson,如何使用只读属性别名来实现向后兼容性?

标签 java json jackson

我们有一个表示某种配置的结构。我们在单词periodicity中出现了拼写错误,将“o”错误地拼写为period*o*city。下面的示例源是经过更正的源。但是,我需要能够读取旧的配置文件以保持向后兼容性。

我可以让 JSON Jackson 在反序列化时识别拼写错误的字段/属性,但在序列化时忽略它吗?

我们正在使用 JSON Jackson 2.6.6 版本。

package foo;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

@JsonInclude(Include.NON_EMPTY)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Rule {
    private LogPeriodicity periodicityLevel;
    private Integer periodicity;

    // ctors and some other methods omitted for brevity

    public LogPeriodicity getPeriodicityLevel() {
        return periodicityLevel;
    }

    public void setPeriodicityLevel(LogPeriodicity periodicityLevel) {
        this.periodicityLevel = periodicityLevel;
    }

    public Integer getPeriodicity() {
        return periodicity;
    }

    public void setPeriodicity(Integer periodicity) {
        this.periodicity = periodicity;
    }
}

最佳答案

如果我的问题正确,你想要这样的东西吗?

MyClass obj =  mapper.readValue("{ \"name\" : \"value\"}", MyClass.class);
String serialized = mapper.writeValueAsString(obj);

MyClass obj2 =  mapper.readValue("{ \"name2\" : \"value\"}", MyClass.class);
String serialized2 = mapper.writeValueAsString(obj2);

if( Objects.equals(serialized2, serialized))
    System.out.println("Success " + serialized + " == " + serialized2 );

如果你不想在 POJO 中添加额外的字段,你可以像这样添加 setter:

public static class MyClass {
    @JsonProperty
    private String name = null;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @JsonSetter
    public void setName2(String name2) {
        setName(name2);
    }
}

您或许还可以注册旧版 Mixin 而不是 @JsonSetter

public abstract class  LegacyMyClassMixIn{
    @JsonProperty("name")
    private String name;
    @JsonGetter("name")
    public abstract String getName();
    @JsonSetter("name2")
    public abstract void setName(String name) ;
}

并像这样使用它:

SimpleModule module = new SimpleModule();
module.setMixInAnnotation(MyClass.class, LegacyMyClassMixIn.class);
mapper2.registerModule(module);

顺便说一句,在 Gson 中,只需 1 行即可完成 @SerializedName(value="name", alter={"name2"}) public String name = null;

关于java - JSON Jackson,如何使用只读属性别名来实现向后兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37030791/

相关文章:

java - jackson 在 map 上捕捉到无法识别的领域

java - JPA加入专栏

java - 我应该如何读取带有编号对象的 JSON?

java - ThreadLocalRandom 如何减少争用?

javascript - 数组位于另一个数组中

angularjs - 如何发布 JSON 对象 angularjs

json - JAX-RS/Jackson -- 使用未知的根元素名称反序列化 JSON?

spring-boot - Spring Boot Jackson - 日志记录

java - Apache poi : images in spreadsheet are associated with workbook and can not be retrieved/linked with individual worksheet . 。

java - HTTP 500 java.lang.RunTimeException 找不到 FacesContext