2016-05-04 58 views
0

我們有一個代表某種配置的結構。我們有一個錯字週期性,錯誤拼寫爲'o'期* o *城市。下面的示例源是已更正的。但是,我需要能夠讀取舊的配置文件以保持向後兼容性。JSON傑克遜,如何使用只讀屬性別名向後兼容?

我可以讓JSON傑克遜識別拼寫錯誤的字段/反序列化屬性,但在序列化時忽略它嗎?

我們使用JSON傑克遜版本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; 
    } 
} 

回答

1

如果我有你的問題,你想要這樣的事情?

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額外的字段,你可以只添加二傳手是這樣的:

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

你或許可以也登記遺留密新的替代@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", alternate={"name2"}) public String name = null;

+0

做我已經使用了'@ JsonSetter'註釋拼寫錯誤的setter和它爲我工作得很好。謝謝! – wilx