Jackson(三) Annotations

读写注解

@JsonProperty

/* 该注解可以用于字段上、Getter方法或Setter方法上都可以生效。
目的是在序列化对象到json时,使用@JsonProperty的value值作为json的属性。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    @JsonProperty("location")
    private Address address;
    private String[] hobby;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
}
/*
加入@JsonProperty注解后,执行的结果如下
{
  "id" : 1,
  "username" : "zhangSan",
  "password" : "1001",
  "hobby" : [ "object1", "object2", "object3" ],
  "location" : {
    "city" : "shanghai",
    "street" : "nanjinglu"
  }
}
*/

@JsonIgnore和@JsonIgnoreProperties

/* @JsonIgnore注解可以用于字段上、Getter方法或Setter方法上。
@JsonIgnoreProperties注解只能用于类上,它可以指定一个字符串数组。*/

@JsonIgnoreProperties({"username","password"})
public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    @JsonIgnore
    private String[] hobby;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
}
/*
加入@JsonIgnore注解后,执行结果如下
{
  "id" : 1,
  "address" : {
    "city" : "shanghai",
    "street" : "nanjinglu"
  }
}
*/

@JsonIgnoreType

/*此注解只能作用于类上,此类上的所有字段不能被序列化。*/

@JsonIgnoreType
public class Address implements Serializable {
    private static final long serialVersionUID = 1310389268587385235L;
    private String city;
    private String street;

    public Address() {
        super();
    }
    public Address(String city, String street) {
        super();
        this.city = city;
        this.street = street;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
}
/*
重新序列化Person类,执行结果如下
{
  "id" : 1,
  "username" : "zhangSan",
  "password" : "1001",
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T05:04:24.556+0000"
}
*/

@JsonAutoDetect

/* 如果在序列化和在反序列化时,通过指定字段、Getter方法、Setter方法和构造器的修饰符去决定哪些属性可以被序列化和反序列化,@JsonAutoDetect注解作用于此。*/

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
                getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
                setterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
                creatorVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY)
public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id = 1002;
    public String username = "zhangxiaoxiao";
    private String password = "123456";
    private Address address = new Address("ShenZhen", "HuaWei");
    private String[] hobby = new String[]{"eat","drink","play"};
    private Date birthdy = new Date();

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    protected String getPassword() {
        return password;
    }
    protected void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    protected Date getBirthdy() {
        return birthdy;
    }
    protected void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
}

/*
加入JsonAutoDetect注解后,执行的结果如下
{
  "id" : 1002,
  "username" : "zhangxiaoxiao",
  "address" : {
    "city" : "ShenZhen",
    "street" : "HuaWei"
  },
  "hobby" : [ "eat", "drink", "play" ]
}
*/

读注解

@JsonSetter

/* 如果json文件中的属性与java类中的属性不一致时,就无法把json映射到java的字段中。
此时就需要使用@JsonSetter注解,只能放在字段的setter方法上才能生效。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;

    public int getId() {
        return id;
    }
    @JsonSetter("person_id")
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", username=" + username + ", password="
                + password + ", address=" + address + ", hobby="
                + Arrays.toString(hobby) + ", birthdy=" + birthdy + "]";
    }
}

@Test
public void testJsonSetter() throws IOException{
    ObjectMapper mapper = new ObjectMapper();
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    InputStream objectJsonIn = this.getClass().getClassLoader()
                                .getResourceAsStream("serialize.json");
    Person person = mapper.readValue(objectJsonIn, Person.class);
    System.out.println(person);
}
/*
读取的json文件如下
{
  "person_id" : 1,
  "username" : "zhangSan",
  "password" : "1001",
  "address" : {
    "city" : "shanghai",
    "street" : "renminglu"
  },
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T05:40:54.945+0000"
}

加入@JsonSetter注解后,执行的结果如下
Person [id=1, username=zhangSan, password=1001, address=Address [city=shanghai, street=renminglu], hobby=[object1, object2, object3], birthdy=Fri Dec 23 13:40:54 CST 2016]
*/

@JsonAnySetter

/* 如果java类中没有对应的映射类型,可以在java中旋转一个map属性,并在它的setter方法上加入@JsonAnySetter注解。至使json文件中出现的键值对(在java类中找不到映射)会自动的存储在这个map集合中。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;
    //新加入的字段,用于存储没有映射的字段
    private Map<String, Object> properties = new HashMap<>();

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    public Object get(String fieldName){
        return this.properties.get(fieldName);
    }
    @JsonAnySetter
    public void set(String fieldName, Object value){
        this.properties.put(fieldName, value);
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", username=" + username + ", password="
                + password + ", address=" + address + ", hobby="
                + Arrays.toString(hobby) + ", birthdy=" + birthdy
                + ", properties=" + properties + "]";
    }
}
/*
读取的json文件如下
{
  "id" : 1,
  "username" : "zhangSan",
  "password" : "1001",
  "address" : {
    "city" : "shanghai",
    "street" : "renminglu"
  },
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T05:40:54.945+0000",
  "newKey" : "newValue"
}

加入@JsonAnySetter注解后,执行的结果如下
Person [id=1, username=zhangSan, password=1001, address=Address [city=shanghai, street=renminglu], hobby=[object1, object2, object3], birthdy=Fri Dec 23 13:40:54 CST 2016, properties={newKey=newValue}]
*/

@JsonCreator

/* 当jackson在创建一个值实例时,默认情况下使用的是无参的构造器。但你也可以使用有参的构造器或静态的工厂方法去创建实例。如果这样做的话,你将需要使用@JsonCreator注解和@JsonProperty注解(绑定名字到参数)*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;

    @JsonCreator
    public Person(@JsonProperty("id") int id,
                  @JsonProperty("username") String username, 
                  @JsonProperty("password") String password, 
                  @JsonProperty("address") Address address,
                  @JsonProperty("hobby") String[] hobby, 
                  @JsonProperty("birthdy") Date birthdy) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.address = address;
        this.hobby = hobby;
        this.birthdy = birthdy;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", username=" + username + ", password="
                + password + ", address=" + address + ", hobby="
                + Arrays.toString(hobby) + ", birthdy=" + birthdy + "]";
    }
}
/*
加入@JsonCreator注解后,执行的结果如下
Person [id=1, username=zhangSan, password=1001, address=Address [city=shanghai, street=renminglu], hobby=[object1, object2, object3], birthdy=Fri Dec 23 13:40:54 CST 2016]
*/

@JacksonInject

/*如果在解析json文件到java对象时,希望jackson框架注入值到java对象的属性中,可以使用此注解。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;
    @JacksonInject
    private String source;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    public String getSource() {
        return source;
    }
    public void setSource(String source) {
        this.source = source;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", username=" + username + ", password="
                + password + ", address=" + address + ", hobby="
                + Arrays.toString(hobby) + ", birthdy=" + birthdy + ", source="
                + source + "]";
    }
}

@Test
public void testJacksonInject() throws IOException{
    ObjectMapper mapper = new ObjectMapper();
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    InputStream objectJsonIn = this.getClass().getClassLoader()
                                   .getResourceAsStream("serialize.json");

    InjectableValues inject = new InjectableValues.Std()
                                   .addValue(String.class, "com.ifangyou");

    Person person = mapper.reader(inject)
                        .forType(Person.class).readValue(objectJsonIn);

    System.out.println(person);
}
/*
加入@JacksonInject注解后,执行的结果如下
Person [id=1, username=zhangSan, password=1001, address=Address [city=shanghai, street=renminglu], hobby=[object1, object2, object3], birthdy=Fri Dec 23 13:40:54 CST 2016, source=com.ifangyou]
*/

@JsonDeserialize

/*该注解可以用于类、属性、方法及方法的入参上。在反序列化成java对象时,可以用子类接收序列化后的json数据,如@JsonDeserialize(as=Location.class)。还可以格式化json文件的数据到java对象,如把json文件中的 "deleted":0 映射成java的deleted属性的false。*/

例一:
public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    @JsonDeserialize(as=Location.class)
    private Address address;
    private String[] hobby;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", username=" + username + ", password="
                + password + ", address=" + address + ", hobby="
                + Arrays.toString(hobby) + "]";
    }
}

/**
 * 继承Address类,并加入了新的字段
 * @author Alex Jiang
 */
public class Location extends Address implements Serializable {
    private static final long serialVersionUID = 1L;
    private String province;

    public Location() {
        super();
    }
    public Location(String city, String street, String province) {
        super(city, street);
        this.province = province;
    }
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    @Override
    public String toString() {
        return "Location [province=" + province + ", getProvince()="
                + getProvince() + ", getCity()=" + getCity() + ", getStreet()="
                + getStreet() + "]";
    }

public class Address implements Serializable {
    private static final long serialVersionUID = 1310389268587385235L;
    private String city;
    private String street;

    public Address() {
        super();
    }
    public Address(String city, String street) {
        super();
        this.city = city;
        this.street = street;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    @Override
    public String toString() {
        return "Address [city=" + city + ", street=" + street + "]";
    }
}

@Test
public void testJsonSerialize() throws IOException{
    Person person = new Person();
    person.setId(1);
    person.setUsername("zhangSan");
    person.setPassword("1001");
    //父类引用指向子类实体
    person.setAddress(new Location("heze", "renminglu", "shangdong"));
    person.setHobby(new String[]{"object1", "object2", "object3"});

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    String basePath = this.getClass().getClassLoader()
                            .getResource("").getPath().substring(1);
    mapper.writeValue(new FileOutputStream(
                            new File(basePath + "serialize.json")), person);
}

@Test
public void testJsonDeserialize_1() throws IOException{
    ObjectMapper mapper = new ObjectMapper();
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    InputStream objectJsonIn = this.getClass().getClassLoader()
                                .getResourceAsStream("serialize.json");
    Person person = mapper.readValue(objectJsonIn, Person.class);
    System.out.println(person);
}
/*
反序列化之后的执行结果,address字段读取的类型为Location.class类型。
Person [id=1, username=zhangSan, password=1001, address=Location [province=shangdong, getProvince()=shangdong, getCity()=heze, getStreet()=renminglu], hobby=[object1, object2, object3]]
*/
例二
public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;
    @JsonDeserialize(using = OptimizedBooleanDeserializer.class)
    private boolean deleted;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    public boolean isDeleted() {
        return deleted;
    }
    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", username=" + username + ", password="
                + password + ", address=" + address + ", hobby="
                + Arrays.toString(hobby) + ", birthdy=" + birthdy
                + ", deleted=" + deleted + "]";
    }
}

public class OptimizedBooleanDeserializer extends JsonDeserializer<Boolean> {
    @Override
    public Boolean deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException,
            JsonProcessingException {
        String text = jsonParser.getText();
        if ("0".equals(text))
            return false;

        return true;
    }
}
/*
读取的json文件如下
{
  "id" : 1,
  "username" : "zhangSan",
  "password" : "1001",
  "address" : {
    "city" : "shanghai",
    "street" : "renminglu"
  },
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T05:40:54.945+0000",
  "deleted" : 0
}

加入@JsonDeserialize注解后,执行的结果如下
Person [id=1, username=zhangSan, password=1001, address=Address [city=shanghai, street=renminglu], hobby=[object1, object2, object3], birthdy=Fri Dec 23 13:40:54 CST 2016, deleted=false]
*/

写注解

@JsonInclude

/* 如果希望在把java对象序列化到json文件时,需要给java对象的属性设置一些条件,如null字段或empty字段没能被序列化,就可以使用@JsonInclude注解。*/

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
}

@Test
public void testJsonInclude() throws IOException{
    Person person = new Person();
    person.setId(1);
    //如果字段的值为null,就不能被序列化
    person.setUsername(null);
    person.setPassword(null);
    person.setAddress(new Address("shanghai", "nanjinglu"));
    person.setHobby(new String[]{"object1", "object2", "object3"});
    person.setBirthdy(new Date());

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    mapper.writeValue(System.out, person);
}
/*
加入@JsonInclude注解后,执行的结果如下
{
  "id" : 1,
  "address" : {
    "city" : "shanghai",
    "street" : "nanjinglu"
  },
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T07:23:34.926+0000"
}
*/

@JsonGetter

/* 要序列化的java对象的属性没有显示的Getter和Setter方法时,需要用@JsonGetter显示的标注为Getter方法,以便于序列化为json文件。json文件中的键为@JsonGetter注解的value值。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;
    private String jsonGetter;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    @JsonGetter("jsonGetterKey")
    public String jsonGetter() {
        return jsonGetter;
    }
    @JsonSetter("jsonGetterKey")
    public void jsonGetter(String jsonGetter) {
        this.jsonGetter = jsonGetter;
    }
}

@Test
public void testJsonGetter() throws IOException{
    Person person = new Person();
    person.setId(1);
    person.setUsername(null);
    person.setPassword(null);
    person.setAddress(new Address("shanghai", "nanjinglu"));
    person.setHobby(new String[]{"object1", "object2", "object3"});
    person.setBirthdy(new Date());
    person.jsonGetter("jsonGetterValue");

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    mapper.writeValue(System.out, person);
}
/*
加入@JsonGetter注解后,执行的结果如下
{
  "id" : 1,
  "username" : null,
  "password" : null,
  "address" : {
    "city" : "shanghai",
    "street" : "nanjinglu"
  },
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T07:38:58.842+0000",
  "jsonGetterKey" : "jsonGetterValue"
}
*/

@JsonAnyGetter

/* 当需要序列化各种不同的数据到json文件时,可以在java中指定一个Map类型的对象,并显示在Getter方法上加入JsonAnyGetter注解。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;
    private Map<String, Object> properties = new HashMap<>();

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    @JsonAnyGetter
    public Map<String, Object> properties() {
        return properties;
    }
    @JsonAnySetter
    public void properties(Map<String, Object> properties) {
        this.properties = properties;
    }
}

@Test
public void testJsonAnyGetter() throws IOException{
    Person person = new Person();
    person.setId(1);
    person.setUsername("zhangsan");
    person.setPassword("jiubugaosuni");
    person.setAddress(new Address("shanghai", "nanjinglu"));
    person.setHobby(new String[]{"object1", "object2", "object3"});
    person.setBirthdy(new Date());
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("propKey1", "propValue1");
    properties.put("propKey2", "propValue2");
    person.properties(properties);

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    mapper.writeValue(System.out, person);
}
/*
加入@JsonAnyGetter注解后,执行的结果如下
{
  "id" : 1,
  "username" : "zhangsan",
  "password" : "jiubugaosuni",
  "address" : {
    "city" : "shanghai",
    "street" : "nanjinglu"
  },
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T07:58:54.210+0000",
  "propKey1" : "propValue1",
  "propKey2" : "propValue2"
}
*/

@JsonPropertyOrder

/* 如果自定义序列化数据的顺序,可以用@JsonPropertyOrder注解 */

@JsonPropertyOrder({"birthdy","hobby","address","password","username","id"})
public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
}
/*
加入@JsonPropertyOrder注解后,执行的结果如下
{
  "birthdy" : "2016-12-23T08:04:29.465+0000",
  "hobby" : [ "object1", "object2", "object3" ],
  "address" : {
    "city" : "shanghai",
    "street" : "nanjinglu"
  },
  "password" : "jiubugaosuni",
  "username" : "zhangsan",
  "id" : 1
}
*/

@JsonRawValue

/* 默认情况下,如果java对象的属性为字符串,被序列化后的值会自动加入双引号。如是不想叫jackson自动加入双引号,可以使用@JsonRawValue注解。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;
    @JsonRawValue
    private String specialCharacter;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    public String getSpecialCharacter() {
        return specialCharacter;
    }
    public void setSpecialCharacter(String specialCharacter) {
        this.specialCharacter = specialCharacter;
    }
}

@Test
public void testJsonRawValue() throws IOException{
    Person person = new Person();
    person.setId(1);
    person.setUsername("zhangsan");
    person.setPassword("jiubugaosuni");
    person.setAddress(new Address("shanghai", "nanjinglu"));
    person.setHobby(new String[]{"object1", "object2", "object3"});
    person.setBirthdy(new Date());
    person.setSpecialCharacter("$#&%$#");

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    mapper.writeValue(System.out, person);
}
/*
加入@JsonRawValue注解后,执行的结果如下
{
  "id" : 1,
  "username" : "zhangsan",
  "password" : "jiubugaosuni",
  "address" : {
    "city" : "shanghai",
    "street" : "nanjinglu"
  },
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T08:11:35.800+0000",
  "specialCharacter" : $#&%$#
}
*/

@JsonValue

/* 如果自定序列化java对象的显示形式,可以定义一个方法并把@JsonValue置于方法上。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    @JsonValue
    public String toJson(){
        return this.username+","+this.password+","+Arrays.toString(this.hobby);
    }
}
/*
加入@JsonValue注解后,执行的结果如下
"zhangsan,jiubugaosuni,[object1, object2, object3]"
*/

@JsonSerialize

/* 当自定义序列化java对象的某个属性时,需要继承JsonSerializer类,并覆写serialize(Boolean, JsonGenerator, SerializerProvider)方法。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    private Address address;
    private String[] hobby;
    private Date birthdy;
    @JsonSerialize(using = OptimizedBooleanSerializer.class)
    private boolean deleted;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    public boolean isDeleted() {
        return deleted;
    }
    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }
}

public class OptimizedBooleanSerializer extends JsonSerializer<Boolean> {
    @Override
    public void serialize(Boolean value, JsonGenerator gen,
            SerializerProvider serializers) throws IOException,
            JsonProcessingException {
        if(value){
            gen.writeNumber(1);
        }else{
            gen.writeNumber(0);
        }
    }
}

@Test
public void testJsonSerialize() throws IOException{
    Person person = new Person();
    person.setId(1);
    person.setUsername("zhangsan");
    person.setPassword("jiubugaosuni");
    person.setAddress(new Address("shanghai", "nanjinglu"));
    person.setHobby(new String[]{"object1", "object2", "object3"});
    person.setBirthdy(new Date());
    person.setDeleted(true);

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    mapper.writeValue(System.out, person);
}
/*
加入JsonSerialize注解后,执行的结果如下
{
  "id" : 1,
  "username" : "zhangsan",
  "password" : "jiubugaosuni",
  "address" : {
    "city" : "shanghai",
    "street" : "nanjinglu"
  },
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23T08:53:00.094+0000",
  "deleted" : 1
}
*/

@JsonFormat和@JsonUnwrapped

/* 当序列化成json时,@JsonFormat用于格式化时间和日期。当某个属性在序列化时不要被包裹,但在反序列化时要被包裹,@JsonUnwrapped的作用就在于此。*/

public class Person implements Serializable {
    private static final long serialVersionUID = -4653164706668338935L;
    private int id;
    private String username;
    private String password;
    @JsonUnwrapped
    private Address address;
    private String[] hobby;
    @JsonFormat(pattern="yyyy-MM-dd")
    private Date birthdy;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public Date getBirthdy() {
        return birthdy;
    }
    public void setBirthdy(Date birthdy) {
        this.birthdy = birthdy;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", username=" + username + ", password="
                + password + ", address=" + address + ", hobby="
                + Arrays.toString(hobby) + ", birthdy=" + birthdy + "]";
    }
}

@Test
public void testJsonFormatJsonUnwrapped() throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    Person person = new Person();
    person.setId(1);
    person.setUsername("zhangSan");
    person.setPassword("1001");
    person.setAddress(new Address("shanghai", "nanjinglu"));
    person.setHobby(new String[]{"object1", "object2", "object3"});
    person.setBirthdy(new Date());

    mapper.writeValue(System.out, person);
}
/*
加入@JsonFormat和@JsonUnwrapped注解后,执行的结果如下
{
  "id" : 1,
  "username" : "zhangSan",
  "password" : "1001",
  "city" : "shanghai",
  "street" : "nanjinglu",
  "hobby" : [ "object1", "object2", "object3" ],
  "birthdy" : "2016-12-23"
}
*/

@JsonTypeInfo

/*这是一个用于多态的注解,如果要序列化的java对象的父类型(可以是普通类或抽象类)派生出很多子类。为了在json文件中区分是哪一个子类的序列化,就需要使用@JsonTypeInfo注解。*/

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
public class Person implements Serializable {
    private static final long serialVersionUID = -5634559189866427421L;
    private int id;
    private String name;
    private int age;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

public class Employee extends Person {
    private static final long serialVersionUID = 6751608503844118238L;
    private Double salary;

    public Double getSalary() {
        return salary;
    }
    public void setSalary(Double salary) {
        this.salary = salary;
    }
}

public class Customer extends Person {
    private static final long serialVersionUID = 4801233166931706124L;
    private String contact;

    public String getContact() {
        return contact;
    }
    public void setContact(String contact) {
        this.contact = contact;
    }
}

@Test
public void testJsonTypeInfo() throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    Employee employee = new Employee();
    employee.setId(10012);
    employee.setName("Alex");
    employee.setAge(29);
    employee.setSalary(9999d);

    Customer customer = new Customer();
    customer.setId(20012);
    customer.setName("Eric");
    customer.setAge(32);
    customer.setContact("13612345678");

    mapper.writeValue(System.out, employee);
    mapper.writeValue(System.out, customer);
}

/*
加入JsonSerialize注解后,执行的结果如下
{
  "@class" : "com.jdy.polymorphism.Employee",
  "id" : 10012,
  "name" : "Alex",
  "age" : 29,
  "salary" : 9999.0
}

{
  "@class" : "com.jdy.polymorphism.Customer",
  "id" : 20012,
  "name" : "Eric",
  "age" : 32,
  "contact" : "13612345678"
}
*/
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值