Jackson详解

来源:互联网 发布:打开app显示网络错误 编辑:程序博客网 时间:2024/06/07 04:53

一 jackson对象和字符串及其数组对象和字符串相互转换

1.maven引入Jackson包

<dependencies>    <dependency>        <groupId>com.fasterxml.jackson.core</groupId>        <artifactId>jackson-core</artifactId>        <version>2.7.4</version>    </dependency>    <dependency>        <groupId>com.fasterxml.jackson.core</groupId>        <artifactId>jackson-annotations</artifactId>        <version>2.7.4</version>    </dependency>    <dependency>        <groupId>com.fasterxml.jackson.core</groupId>        <artifactId>jackson-databind</artifactId>        <version>2.7.4</version>    </dependency></dependencies>

2.新建User类

import java.util.Date;public class User {    private String mName;    private int age;    private Date birthday;    private String email;    public String getmName() {        return mName;    }    public void setmName(String mName) {        this.mName = mName;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }    @Override    public String toString() {        return "User [mName=" + mName + ", age=" + age + ", birthday="                + birthday + ", email=" + email + "]";    }}

3.新建测试类

public class JacksonTest {    public static void main(String[] args) throws IOException {        User user=new User();        user.setAge(11);        user.setBirthday(new Date());        user.setEmail("123456");        user.setmName("jesse1");        ObjectMapper mapper = new ObjectMapper();        //当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,          //因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略          mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);        // Convert object to JSON string        String json = mapper.writeValueAsString(user);        System.out.println(json);        // Convert Json string to Object        User user2=mapper.readValue(json, User.class);        System.out.println(user2);        User user3=new User();        user3.setAge(33);        user3.setBirthday(new Date());        user3.setEmail("123456");        user3.setmName("jesse3");        List<User> users = new ArrayList<User>();        users.add(user);        users.add(user3);        // Convert List<object> to JSON string        String json3 = mapper.writeValueAsString(users);        System.err.println(json3);        // Convert Json string to List<Object>        List<User> users3=mapper.readValue(json3, new TypeReference<List<User>>() {        });        for (int i = 0; i < users3.size(); i++) {            System.out.println(users3.get(i));        }    }}

4.json常规注解,User类添加如下注解,再次运行测试类

/** * Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解。 @JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性。 @JsonFormat 此注解用于属性上,作用是把Date类型直接转化为想要的格式,如@JsonFormat(pattern = "yyyyMMdd") @JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把eMail属性序列化为mail,@JsonProperty("mail") */public class User {    private String mName;    @JsonIgnore // 不JSON序列化年龄属性    private int age;    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") // 格式化日期属性    private Date birthday;    @JsonProperty("mail") // 序列化email属性为mail    private String email;    public String getmName() {        return mName;    }    public void setmName(String mName) {        this.mName = mName;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }    @Override    public String toString() {        return "User [mName=" + mName + ", age=" + age + ", birthday="                + birthday + ", email=" + email + "]";    }}

二 SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意

一、SpringMVC使用@ResponseBody时返回json的日期格式
前提了解: @ResponseBody 返回json字符串的核心类是org.springframework.http.converter.json.MappingJackson2HttpMessageConverter,它使用了Jackson 这个开源的第三方类库。主要是以下两个jar包:jackson-core-asl;jackson-mapper-asl。

<dependencies>    <dependency>        <groupId>org.codehaus.jackson</groupId>        <artifactId>jackson-core-asl</artifactId>        <version>1.9.13</version>    </dependency>    <dependency>        <groupId>org.codehaus.jackson</groupId>        <artifactId>jackson-mapper-asl</artifactId>        <version>1.9.13</version>    </dependency></dependencies>

出现问题: 使用@ResponseBody时返回json字符串的日期格式。Date类型属性默认返回一个Long型的时间戳,怎样能够返回自定义的日期格式?
解决方案:目前有两种方式实现,
1、局部修改(网上较多,但不推荐);
继承Jackson的抽象类:JsonSerializer,然后在javabean的属性getter()上添加注解@JsonSerialize即可实现。

新建CustomDateSerializer类

import java.io.IOException;  import java.text.SimpleDateFormat;  import java.util.Date;  import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.SerializerProvider;/** @description 自定义返回JSON 数据格中日期格式化处理  */  public class CustomDateSerializer extends JsonSerializer<Date> {    @Override    public void serialize(Date value, JsonGenerator jsonGenerator,            SerializerProvider provider) throws IOException,            JsonProcessingException {        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");        jsonGenerator.writeString(sdf.format(value));    }}

User类的birthday属性修改如下
@JsonSerialize(using = CustomDateSerializer.class)
private Date birthday;

2、使用内置的日期格式化工具
同样是全局设置json响应的日期格式,但此方法可以和@JsonFormat共存,也就是说可以全局设置一个格式,特定的需求可以使用注解设置。
配置spring_mvc文件

<!-- MappingJackson2HttpMessageConverter处理responseBody 里面日期类型 xsi:schemaLocation引入版本必须大于等于3.1 --><mvc:annotation-driven>    <mvc:message-converters>        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">            <property name="supportedMediaTypes">                <list>                    <value>text/html;charset=UTF-8</value>                </list>            </property>            <property name="objectMapper">                <bean class="com.fasterxml.jackson.databind.ObjectMapper">                    <property name="dateFormat">                        <bean class="java.text.SimpleDateFormat">                            <constructor-arg type="java.lang.String" value="yyyyMMddHHmmss" />                        </bean>                    </property>                </bean>            </property>        </bean>    </mvc:message-converters></mvc:annotation-driven>