Jackson 练习(一)

package com.yc.model;

/**
 * 班级
 * @author Administrator
 *
 */
public class ClassModel {

    private String classCode;
    private String className;

    public String getClassCode() {
        return classCode;
    }

    public void setClassCode(String classCode) {
        this.classCode = classCode;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

}
package com.yc.model;

import java.util.Date;

/**
 * 学生表
 * @author WUYF
 *
 */
public class StudentModel {
    private String classCode;
    private String stuCode;
    private String stuName;
    private Integer stuAge;
    private Date stuBirthday = new Date();

    public String getClassCode() {
        return classCode;
    }

    public void setClassCode(String classCode) {
        this.classCode = classCode;
    }

    public String getStuCode() {
        return stuCode;
    }

    public void setStuCode(String stuCode) {
        this.stuCode = stuCode;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public Integer getStuAge() {
        return stuAge;
    }

    public void setStuAge(Integer stuAge) {
        this.stuAge = stuAge;
    }

    public Date getStuBirthday() {
        return stuBirthday;
    }

    public void setStuBirthday(Date stuBirthday) {
        this.stuBirthday = stuBirthday;
    }

}
package com.yc.model;

import java.util.Set;

/**
 * 班级信息
 * @author Administrator
 *
 */
public class ClassInfo {
    
    private ClassModel classModel;
    private Set<StudentModel> studentModelList;

    public ClassModel getClassModel() {
        return classModel;
    }

    public void setClassModel(ClassModel classModel) {
        this.classModel = classModel;
    }

    public Set<StudentModel> getStudentModelList() {
        return studentModelList;
    }

    public void setStudentModelList(Set<StudentModel> studentModelList) {
        this.studentModelList = studentModelList;
    }

}
package com.yc.test;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.naming.InitialContext;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yc.model.ClassInfo;
import com.yc.model.ClassModel;
import com.yc.model.StudentModel;

@SuppressWarnings("unused")
public class jacksonTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        init();
        doTest();
        testJsonGenerate();
    }
    
    
    
    /******************** 变量定义   ************************/
    private static ObjectMapper jsonMapper = new ObjectMapper();
    private static ClassInfo classInfo = new ClassInfo();
    
    private static JsonGenerator jsonGenerator = null;
    
    
    /******************** 初始化 **************************/
    private static void init()
    {
        classInfo.setStudentModelList(new HashSet<StudentModel>());
        // 班级数据初骀化
        ClassModel classModel = new ClassModel();
        classModel.setClassCode("001");
        classModel.setClassName("计0312班");
        
        classInfo.setClassModel(classModel);
        
        // 学生数据初始化
        for(Integer i= 1; i<5;i++)
        {
            StudentModel studentModel = new StudentModel();
            studentModel.setClassCode(classModel.getClassCode());
            studentModel.setStuCode("00" + i.toString());
            studentModel.setStuName("学生_" + studentModel.getStuCode());
            studentModel.setStuAge(18 + i);
            
            classInfo.getStudentModelList().add(studentModel);
        }
        
        System.out.println(classInfo);
        
        
    }
    
    /******************** 测试主体 **************************/
    
    private static void testJsonGenerate()
    {
        try {
            jsonGenerator = jsonMapper.getFactory().createGenerator(System.out,JsonEncoding.UTF8);
            
            jsonGenerator.writeObject(classInfo);
            
            jsonGenerator.flush();
            jsonGenerator.close();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    
    
    /**
     * @throws IOException 
     * 
     */
    private static void doTest()
    {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            
            jsonMapper.setDateFormat(dateFormat);
            
            ClassInfo classInfoTmp = new ClassInfo();
            
            String classInfoJsonString = jsonMapper.writeValueAsString(classInfo);
            System.out.println("classInfoJsonString:");
            System.out.println(classInfoJsonString);
            
            classInfoTmp = jsonMapper.readValue(classInfoJsonString, ClassInfo.class);
            
            String classInfoJsonTmpString = jsonMapper.writeValueAsString(classInfoTmp);
            System.out.println("classInfoJsonTmpString:");
            System.out.println(classInfoJsonTmpString);
            
        } catch (JsonProcessingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
}

另外 可以在字段属性上增加 注解来实现自定义日期格式

使用Jackson时转换JSON时,日期格式设置
近日,使用Jackson转化JSON对象的时候,显示的时候,日期始终显示不正确,输出的日期是一串数字代表的时间戳,不符合要求,所以想到Jackson应当有方法设置输出的日期格式。后来一查果然有两种方式来实现:
1.普通的方式:
默认是转成timestamps形式的,通过下面方式可以取消timestamps。
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
 这样将使时间生成使用所谓的use a [ISO-8601 ]-compliant notation, 输出类似如下格式的时间: "1970-01-01T00:00:00.000+0000".
当然也可以自定义输出格式:
objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
myDateFormat对象为java.text.DateFormat,具体使用清查java API
2.annotaion的注释方式:
先定义自己需要的格式,例如:
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

/**
 *  java日期对象经过Jackson库转换成JSON日期格式化自定义类
 * @author godfox
 * @date 2010-5-3
 */
public class CustomDateSerializer extends JsonSerializer<Date> {

        @Override
        public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                String formattedDate = formatter.format(value);
                jgen.writeString(formattedDate);
        }
}
 然后在你的POJO上找到日期的get方法
 @JsonSerialize(using = CustomDateSerializer.class)
        public Date getCreateAt() {
                return createAt;
        }

// 反序列化 成 javabean

            ObjectMapper jsonMapper = new ObjectMapper();
            rtnResult = jsonMapper.writeValueAsString(invoiceDtos);
            
            List<InvoiceDetail> deJson = (List<InvoiceDetail>)jsonMapper.readValue(rtnResult, new TypeReference<List<InvoiceDetail>>() {});
原文地址:https://www.cnblogs.com/wuyifu/p/3653618.html