Jackson详解

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

1.maven引入Jackson包

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-coreartifactId>
        <version>2.7.4version>
    dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-annotationsartifactId>
        <version>2.7.4version>
    dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-databindartifactId>
        <version>2.7.4version>
    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 users = new ArrayList();
        users.add(user);
        users.add(user3);

        // Convert List to JSON string
        String json3 = mapper.writeValueAsString(users);
        System.err.println(json3);

        // Convert Json string to List
        List users3=mapper.readValue(json3, new TypeReference>() {
        });
        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.jacksongroupId>
        <artifactId>jackson-core-aslartifactId>
        <version>1.9.13version>
    dependency>
    <dependency>
        <groupId>org.codehaus.jacksongroupId>
        <artifactId>jackson-mapper-aslartifactId>
        <version>1.9.13version>
    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文件


<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8value>
                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>

你可能感兴趣的:(Jackson详解)