首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jackson,如何使用只读属性别名进行向后兼容?

Jackson,如何使用只读属性别名进行向后兼容?
EN

Stack Overflow用户
提问于 2016-05-04 14:30:40
回答 1查看 2.2K关注 0票数 0

我们有一个表示某种配置的结构。我们有一个错误的词周期性,它被错误地拼写为'o‘作为周期*o*城市。下面的示例源是更正的源。但是,我需要能够读取旧的配置文件来保持向后兼容性。

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

我们使用的是Jackson的2.6.6版本。

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-04 15:28:51

如果我没弄错你的问题你想要这样的东西?

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

代码语言:javascript
复制
public abstract class  LegacyMyClassMixIn{
    @JsonProperty("name")
    private String name;
    @JsonGetter("name")
    public abstract String getName();
    @JsonSetter("name2")
    public abstract void setName(String name) ;
}

像这样使用它:

代码语言:javascript
复制
SimpleModule module = new SimpleModule();
module.setMixInAnnotation(MyClass.class, LegacyMyClassMixIn.class);
mapper2.registerModule(module);

顺便说一下,在Gson中,只需1行@SerializedName(value="name", alternate={"name2"}) public String name = null;就可以完成。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37030791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档