2016-04-15 134 views
-3

我有一个类,我们说Person,我想使用Jackson填充JSON,但属性名称因源而异。这里的代码看起来目前:具有不同JSON属性名称的继承模型

class Person { 
    protected String firstName; 
    protected String lastName; 
    protected String address; 

    public abstract void setFirstName(String firstName); 
    public abstract void setLastName(String lastName); 
    public abstract void setAddress(String address); 

    // getters etc. 
} 

class PersonFormat1 extends Person { 
    @Override 
    @JsonProperty("firstName") 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @Override 
    @JsonProperty("lastName") 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Override("address") 
    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

class PersonFormat2 extends Person { 
    @Override 
    @JsonProperty("fName") 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @Override 
    @JsonProperty("lName") 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Override("addr") 
    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

正如你所看到的,PersonFormat1PersonFormat2的结构相同,但我以指定不同的属性名称需要不同的子类。

有没有一种方法来强制模型没有重新声明和重新实现每种方法的样板?

回答

1

一种方法是使用PropertyNamingStrategyhttp://wiki.fasterxml.com/PropertyNamingStrategy

这里是不错的简单演示了如何你可以用它Link to How to Use PropertyNamingStrategy in Jackson


另一种是使用MixInAnnotations http://wiki.fasterxml.com/JacksonMixInAnnotations

MixInAnnotations你可以创建一个Person类和Mixin的任何其他替代属性名称设置。

public static void main(String[] args) throws IOException { 
    ObjectMapper mapper1 = new ObjectMapper(); 
    String person1 = "{\"firstName\":null,\"lastName\":null,\"address\":null}"; 
    Person deserialized1 = mapper1.readValue(person1,Person.class); 

    ObjectMapper mapper2 = new ObjectMapper(); 
    mapper2.addMixIn(Person.class, PersonMixin.class); 
    String person2 = "{\"fName\":null,\"lName\":null,\"addr\":null}"; 
    Person deserialized2 = mapper2.readValue(person2,Person.class); 
} 

public static class Person { 
    @JsonProperty("firstName") 
    String firstName; 
    @JsonProperty("lastName") 
    String lastName; 
    @JsonProperty("address") 
    String address; 

} 

public class PersonMixin { 
    @JsonProperty("fName") 
    String firstName; 
    @JsonProperty("lName") 
    String lastName; 
    @JsonProperty("addr") 
    String address; 
} 
相关问题