• Jackson实现Object对象与Json字符串的互转


    在项目开发过程中,当客户端与服务器响应时,数据交互是必不可少的。然而通过Json实现数据交互成为我们开发中的一部分,进而Jackson为我们的Json转化提供了很好的机制。下面我将利用实例总结如何使用jackson.

    一、准备

    如果你需要使用jackson,你必须得导入相应的架包,有如下三个包

    jackson-annotations;jackson-core;jackson-databind

    Maven引入依赖代码

    <span style="font-size:18px;">			<dependency>
    				<groupId>com.fasterxml.jackson.core</groupId>
    				<artifactId>jackson-databind</artifactId>
    				<version>2.0.6</version>
    			</dependency>
    			<dependency>
    				<groupId>com.fasterxml.jackson.module</groupId>
    				<artifactId>jackson-module-jaxb-annotations</artifactId>
    				<version>2.0.6</version>
    			</dependency>
    			<dependency>
    				<groupId>com.fasterxml.jackson.core</groupId>
    				<artifactId>jackson-core</artifactId>
    				<version>2.3.0</version>
    			</dependency>
    			<dependency>
    				<groupId>com.fasterxml.jackson.core</groupId>
    				<artifactId>jackson-annotations</artifactId>
    				<version>2.3.0</version>
    			</dependency></span>

    二、不带日期的对象实体与json互转

    1.定义实体UserBean.java,DeptBean.java

    <span style="font-size:18px;">package com.jackson.bean;
    
    import java.util.List;
    
    public class DeptBean {
    	private int deptId;
    	private String deptName;
    	private List<UserBean> userBeanList;
    	
    	
    	public int getDeptId() {
    		return deptId;
    	}
    	public void setDeptId(int deptId) {
    		this.deptId = deptId;
    	}
    	public String getDeptName() {
    		return deptName;
    	}
    	public void setDeptName(String deptName) {
    		this.deptName = deptName;
    	}
    	public List<UserBean> getUserBeanList() {
    		return userBeanList;
    	}
    	public void setUserBeanList(List<UserBean> userBeanList) {
    		this.userBeanList = userBeanList;
    	}
    	
    	
    	
    	@Override
    	public String toString() {
    		String userBeanListString = "";
    		for (UserBean userBean : userBeanList) {
    			userBeanListString += userBean.toString() + "
    ";
    		}
    		
    		return "DeptBean [deptId=" + deptId + ", deptName=" + deptName
    				+ ", 
    userBeanListString=" + userBeanListString + "]";
    	}
    	public DeptBean(int deptId, String deptName, List<UserBean> userBeanList) {
    		super();
    		this.deptId = deptId;
    		this.deptName = deptName;
    		this.userBeanList = userBeanList;
    	}
    	public DeptBean() {
    		super();
    	}
    	
    	
    }
    </span>
    <span style="font-size:18px;">package com.jackson.bean;
    
    public class UserBean {
    	private int userId;
    	private String userName;
    	private String password;
    	private String email;
    	public int getUserId() {
    		return userId;
    	}
    	public void setUserId(int userId) {
    		this.userId = userId;
    	}
    	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 String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	@Override
    	public String toString() {
    		return "UserBean [userId=" + userId + ", userName=" + userName
    				+ ", password=" + password + ", email=" + email + "]";
    	}
    	public UserBean(int userId, String userName, String password, String email) {
    		super();
    		this.userId = userId;
    		this.userName = userName;
    		this.password = password;
    		this.email = email;
    	}
    	public UserBean() {
    		super();
    	}
    	
    	
    }
    </span>

    注意:在实体中必须存在无参的构造方法,否则转换时会有如下异常;

    <span style="font-size:18px;">com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.jackson.bean.UserBean]: can not instantiate from JSON object (need to add/enable type information?)</span>

    2.jackson数据转换工具类

    <span style="font-size:18px;">package com.jackson.utils;
    
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    /**
     * The class JacksonUtil
     *
     * json字符与对像转换
     * 
     * @version: $Revision$ $Date$ $LastChangedBy$
     *
     */
    public final class JacksonUtil {
    
    	public static ObjectMapper objectMapper;
    
    	/**
    	 * 使用泛型方法,把json字符串转换为相应的JavaBean对象。
    	 * (1)转换为普通JavaBean:readValue(json,Student.class)
    	 * (2)转换为List,如List<Student>,将第二个参数传递为Student
    	 * [].class.然后使用Arrays.asList();方法把得到的数组转换为特定类型的List
    	 * 
    	 * @param jsonStr
    	 * @param valueType
    	 * @return
    	 */
    	public static <T> T readValue(String jsonStr, Class<T> valueType) {
    		if (objectMapper == null) {
    			objectMapper = new ObjectMapper();
    		}
    
    		try {
    			return objectMapper.readValue(jsonStr, valueType);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    		return null;
    	}
    	
    	/**
    	 * json数组转List
    	 * @param jsonStr
    	 * @param valueTypeRef
    	 * @return
    	 */
    	public static <T> T readValue(String jsonStr, TypeReference<T> valueTypeRef){
    		if (objectMapper == null) {
    			objectMapper = new ObjectMapper();
    		}
    
    		try {
    			return objectMapper.readValue(jsonStr, valueTypeRef);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    		return null;
    	}
    
    	/**
    	 * 把JavaBean转换为json字符串
    	 * 
    	 * @param object
    	 * @return
    	 */
    	public static String toJSon(Object object) {
    		if (objectMapper == null) {
    			objectMapper = new ObjectMapper();
    		}
    
    		try {
    			return objectMapper.writeValueAsString(object);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    		return null;
    	}
    
    }</span>

    3.jackson数据转换具体实现

    <span style="font-size:18px;">package com.jackson.main;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.jackson.bean.DeptBean;
    import com.jackson.bean.UserBean;
    import com.jackson.utils.JacksonUtil;
    
    /**
     * 实例实现利用jackson实现实体对象与json字符串的互相转换
     * @author liangming.deng
     *
     */
    public class JacksonDemo {
    	public static void main(String[] args){
    		
    		UserBean userBean1 = new UserBean(1, "liubei", "123", "liubei@163.com");
    		UserBean userBean2 = new UserBean(2, "guanyu", "123", "guanyu@163.com");
    		UserBean userBean3 = new UserBean(3, "zhangfei", "123", "zhangfei@163.com");
    		
    		
    		List<UserBean> userBeans = new ArrayList<>();
    		userBeans.add(userBean1);
    		userBeans.add(userBean2);
    		userBeans.add(userBean3);
    		
    		DeptBean deptBean = new DeptBean(1, "sanguo", userBeans);
    		//对象转json
    		String userBeanToJson = JacksonUtil.toJSon(userBean1);
    		String deptBeanToJson = JacksonUtil.toJSon(deptBean);
    		
    		System.out.println("deptBean to json:" + deptBeanToJson);
    		System.out.println("userBean to json:" + userBeanToJson);
    		
    		//json转字符串
    		UserBean jsonToUserBean = JacksonUtil.readValue(userBeanToJson, UserBean.class);
    		DeptBean jsonToDeptBean = JacksonUtil.readValue(deptBeanToJson, DeptBean.class);
    		
    		System.out.println("json to DeptBean" + jsonToDeptBean.toString());
    		System.out.println("json to UserBean" + jsonToUserBean.toString());
    		
    		//List 转json字符串
    		String listToJson = JacksonUtil.toJSon(userBeans);
    		System.out.println("list to json:" + listToJson);
    		
    		//数组json转 List
    		List<UserBean> jsonToUserBeans = JacksonUtil.readValue(listToJson, new TypeReference<List<UserBean>>() {
    		});
    		String userBeanString = "";
    		for (UserBean userBean : jsonToUserBeans) {
    			userBeanString += userBean.toString() + "
    ";
    		}
    		System.out.println("json to userBeans:" + userBeanString);
    	}
    	
    	
    }
    </span>


    输出结果:

    <span style="font-size:18px;">deptBean to json:{"deptId":1,"deptName":"sanguo","userBeanList":[{"userId":1,"userName":"liubei","password":"123","email":"liubei@163.com"},{"userId":2,"userName":"guanyu","password":"123","email":"guanyu@163.com"},{"userId":3,"userName":"zhangfei","password":"123","email":"zhangfei@163.com"}]}
    userBean to json:{"userId":1,"userName":"liubei","password":"123","email":"liubei@163.com"}
    json to DeptBeanDeptBean [deptId=1, deptName=sanguo, 
    userBeanListString=UserBean [userId=1, userName=liubei, password=123, email=liubei@163.com]
    UserBean [userId=2, userName=guanyu, password=123, email=guanyu@163.com]
    UserBean [userId=3, userName=zhangfei, password=123, email=zhangfei@163.com]
    ]
    json to UserBeanUserBean [userId=1, userName=liubei, password=123, email=liubei@163.com]
    list to json:[{"userId":1,"userName":"liubei","password":"123","email":"liubei@163.com"},{"userId":2,"userName":"guanyu","password":"123","email":"guanyu@163.com"},{"userId":3,"userName":"zhangfei","password":"123","email":"zhangfei@163.com"}]
    json to userBeans:UserBean [userId=1, userName=liubei, password=123, email=liubei@163.com]
    UserBean [userId=2, userName=guanyu, password=123, email=guanyu@163.com]
    UserBean [userId=3, userName=zhangfei, password=123, email=zhangfei@163.com]
    </span>

    三、带日期的实体对象与json转换

    jackson实现带日期的实体对象与json转换有两种方法

    1).将实体对象中的日期对象定义为String型,在使用的时候再将String型转换为Date型使用,其他就无需修改。

    2).当实体对象中的日期对象定义为Date型,就需要通过集成JsonSerializer<Date>对象完成日期的转换,本段将重点讲解

    1.在UserBean.java和DeptBean.java中分别添加Date createDate

    <span style="font-size:18px;">	private Date createDate;	
            public Date getCreateDate() {
    		return createDate;
    	}
    
    	public void setCreateDate(Date createDate) {
    		this.createDate = createDate;
    	}</span>

    2.实现集成于JsonSerializer<Date>对象的工具类

    <span style="font-size:18px;">package com.jackson.utils;
    
    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;
    
    /**
     * jackson日期转换工具类
     * 
     * @author liangming.deng
     *
     */
    public class JsonDateFormatFull extends JsonSerializer<Date> {
    
    	/**
    	 * Jackson支持日期字符串格式
    	 * "yyyy-MM-dd'T'HH:mm:ss.SSSZ" "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    	 * "EEE, dd MMM yyyy HH:mm:ss zzz" "yyyy-MM-dd"
    	 */
    	@Override
    	public void serialize(Date value, JsonGenerator jgen,
    			SerializerProvider provider) throws
    
    	IOException, JsonProcessingException {
    		SimpleDateFormat formatter = new SimpleDateFormat(
    				"yyyy-MM-dd'T'HH:mm:ss");
    		String formattedDate = formatter.format(value);
    		jgen.writeString(formattedDate);
    
    	}
    
    }
    </span>

    3.在UserBean.java和DeptBean.java中Date变量加入如下注解

    <span style="font-size:18px;">	@JsonSerialize(using = JsonDateFormateFull.class)
    	private Date createDate;</span>

    4.jackson日期互转具体实现

    <span style="font-size:18px;">package com.jackson.main;
    
    import java.util.Date;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.List;
    
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.jackson.bean.DeptBean;
    import com.jackson.bean.UserBean;
    import com.jackson.utils.JacksonUtil;
    
    /**
     *利用jackson实现Json与实体对象的互转
     * @author liangming.deng
     *
     */
    public class JacksonDemo {
    	public static void main(String[] args){
    		
    		UserBean userBean1 = new UserBean(1, "liubei", "123", "liubei@163.com");
    		userBean1.setCreateDate(new Date(Calendar.getInstance().getTimeInMillis()));
    		UserBean userBean2 = new UserBean(2, "guanyu", "123", "guanyu@163.com");
    		userBean2.setCreateDate(new Date(Calendar.getInstance().getTimeInMillis()));
    		UserBean userBean3 = new UserBean(3, "zhangfei", "123", "zhangfei@163.com");
    		userBean3.setCreateDate(new Date(Calendar.getInstance().getTimeInMillis()));
    		
    		
    		List<UserBean> userBeans = new ArrayList<>();
    		userBeans.add(userBean1);
    		userBeans.add(userBean2);
    		userBeans.add(userBean3);
    		
    		DeptBean deptBean = new DeptBean(1, "sanguo", userBeans);
    		deptBean.setCreateDate(new Date(Calendar.getInstance().getTimeInMillis()));
    		//实体对象 转json
    		String userBeanToJson = JacksonUtil.toJSon(userBean1);
    		String deptBeanToJson = JacksonUtil.toJSon(deptBean);
    		
    		System.out.println("deptBean to json:" + deptBeanToJson);
    		System.out.println("userBean to json:" + userBeanToJson);
    		
    		//json 转实体对象
    		UserBean jsonToUserBean = JacksonUtil.readValue(userBeanToJson, UserBean.class);
    		DeptBean jsonToDeptBean = JacksonUtil.readValue(deptBeanToJson, DeptBean.class);
    		
    		System.out.println("json to DeptBean" + jsonToDeptBean.toString());
    		System.out.println("json to UserBean" + jsonToUserBean.toString());
    		
    		//List 转json
    		String listToJson = JacksonUtil.toJSon(userBeans);
    		System.out.println("list to json:" + listToJson);
    		
    		//json 转 List
    		List<UserBean> jsonToUserBeans = JacksonUtil.readValue(listToJson, new TypeReference<List<UserBean>>() {
    		});
    		String userBeanString = "";
    		for (UserBean userBean : jsonToUserBeans) {
    			userBeanString += userBean.toString() + "
    ";
    		}
    		System.out.println("json to userBeans:" + userBeanString);
    	}
    	
    	
    }
    </span>

    5.结果输出

    <span style="font-size:18px;">deptBean to json:{"deptId":1,"deptName":"sanguo","createDate":"2014-11-20T10:58:08","userBeanList":[{"userId":1,"userName":"liubei","password":"123","email":"liubei@163.com","createDate":"2014-11-20T10:58:08"},{"userId":2,"userName":"guanyu","password":"123","email":"guanyu@163.com","createDate":"2014-11-20T10:58:08"},{"userId":3,"userName":"zhangfei","password":"123","email":"zhangfei@163.com","createDate":"2014-11-20T10:58:08"}]}
    userBean to json:{"userId":1,"userName":"liubei","password":"123","email":"liubei@163.com","createDate":"2014-11-20T10:58:08"}
    json to DeptBeanDeptBean [deptId=1, deptName=sanguo, 
    userBeanListString=UserBean [userId=1, userName=liubei, password=123, email=liubei@163.com, createDate=Thu Nov 20 18:58:08 CST 2014]
    UserBean [userId=2, userName=guanyu, password=123, email=guanyu@163.com, createDate=Thu Nov 20 18:58:08 CST 2014]
    UserBean [userId=3, userName=zhangfei, password=123, email=zhangfei@163.com, createDate=Thu Nov 20 18:58:08 CST 2014]
    ]
    json to UserBeanUserBean [userId=1, userName=liubei, password=123, email=liubei@163.com, createDate=Thu Nov 20 18:58:08 CST 2014]
    list to json:[{"userId":1,"userName":"liubei","password":"123","email":"liubei@163.com","createDate":"2014-11-20T10:58:08"},{"userId":2,"userName":"guanyu","password":"123","email":"guanyu@163.com","createDate":"2014-11-20T10:58:08"},{"userId":3,"userName":"zhangfei","password":"123","email":"zhangfei@163.com","createDate":"2014-11-20T10:58:08"}]
    json to userBeans:UserBean [userId=1, userName=liubei, password=123, email=liubei@163.com, createDate=Thu Nov 20 18:58:08 CST 2014]
    UserBean [userId=2, userName=guanyu, password=123, email=guanyu@163.com, createDate=Thu Nov 20 18:58:08 CST 2014]
    UserBean [userId=3, userName=zhangfei, password=123, email=zhangfei@163.com, createDate=Thu Nov 20 18:58:08 CST 2014]
    </span>


    以上为本博文的所有内容。

    源码下载地址:http://download.csdn.net/detail/a123demi/8394327

  • 相关阅读:
    getGuid()
    DELPHI7在WIN8和WIN10下安装和运行
    oracle存储过程返回数据集结果
    咏南多层开发框架支持最新的DELPHI 10 SEATTLE
    咏南中间件支持手机客户端
    最精简的IOCP封装
    完成端口iocp——在螺丝壳里做道场
    异步选择模式中使用完成端口做它的消息队列
    阿里百川IMSDK--自定义群聊界面
    Customizing Navigation Bar and Status Bar
  • 原文地址:https://www.cnblogs.com/fashflying/p/5145156.html
Copyright © 2020-2023  润新知