使用jackson
首先添加jackson依赖
<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>最新版本</version>
<!--<version>1.9.12</version>-->
</dependency>
新建工具类(所有转换方法都写在这个类中)
package com.mmall.util;
import com.mmall.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize.*;
import org.codehaus.jackson.type.JavaType;
import org.codehaus.jackson.type.TypeReference;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Author: LailaiMonkey
* @Description:
* @Date: Created in 10:21 2019/1/24
*/
@Slf4j
public class JsonUtil {
private static ObjectMapper objectMapper=new ObjectMapper();
static {
//对象所有字段全部列入
objectMapper.setSerializationInclusion(Inclusion.ALWAYS);
//取消默认转换timestamps形式,否则日期时间是以时间戳形式显示
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS,false);
//忽略空bean转换json错误
objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS,false);
objectMapper.setDateFormat(new SimpleDateFormat(DateTimeUtil.STANDARD_FORMAT));
//忽略 在Json字符串中存在,但是在Java对象中不存在对应属性的情况。防止错误
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
}
/**
* 实体对象转换Json
* @param obj
* @param <T>
* @return
*/
public static <T> String objToString(T obj){
if (obj==null){
return null;
}
try {
return obj instanceof String ? (String) obj:objectMapper.writeValueAsString(obj);
} catch (Exception e) {
log.warn("Parse object to String error",e);
return null;
}
}
/**
* 实体对象转换Json,得到结果有换行符,分行显示
* @param obj
* @param <T>
* @return
*/
public static <T> String objToStringPretty(T obj){
if (obj==null){
return null;
}
try {
return obj instanceof String ? (String) obj:objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
} catch (Exception e) {
log.warn("Parse object to String error",e);
return null;
}
}
/**
* Json字符转实体对象
* @param str
* @param clazz
* @param <T>
* @return
*/
public static <T> T stringToObj(String str,Class<T> clazz){
if (StringUtils.isEmpty(str)||clazz==null){
return null;
}
try {
return clazz.equals(String.class) ? (T) str:objectMapper.readValue(str,clazz);
}catch (Exception e){
log.warn("Parse object to String error",e);
return null;
}
}
/**
* Json字符串转换List集合
* @param jsonData
* @param beanType
* @param <T>
* @return
*/
public static <T> List<T> jsonToList(String jsonData, Class<T> beanType){
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, new Class[]{beanType});
try {
return (List)objectMapper.readValue(jsonData, javaType);
} catch (Exception e) {
log.warn("Parse object to String error",e);
return null;
}
}
}
public static void main(String[] args) {
User user=new User();
user.setId(2);
user.setEmail("8888@888.com");
user.setCreateTime(new Date());
String s = JsonUtil.obj25tring(user);
String s1 = JsonUtil.obj25tringPretty(user);
User user1 = JsonUtil.string2Obj(s, User.class);
//因为需要转换是List所有json也是集合,所以最外面是【】
String b="["+s+"]";
List<User> users = JsonUtil.jsonToList(b, User.class);
}
}
实体类
待转换Json串字段和实体字段相对应可直接转换,如果待转换Json串的字段为“Id”,实体字段为“id”,可以修改实体字段名称保持一致,也可以使用@JsonProperty(“Id”)注释
public class User {
@JsonProperty("Id")
private Integer id;
private String email;
@JsonProperty("createtime")
private Date createTime;
//get、set方法省略
}
配置参数说明
- Inclusion.ALWAYS
对象中所有字段全部转换
- Inclusion.NON_NULL
对象中只转换非空字段
- Inclusion.NON_DEFAULT
如果对象中字段设置默认值,默认值改变则转换,默认什不改变不转换。默认值初值为Null
- Inclusion.NON_EMPTY
对象中字段值为Null或空串,同StringUtils.isEmpty判断方法一样
使用fastjson
简介
- Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
- Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
特性
- 提供服务器端、安卓客户端两种解析工具,性能表现较好。
- 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
- 允许转换预先存在的无法修改的对象(只有class、无源代码)。
- Java泛型的广泛支持。
- 允许对象的自定义表示、允许自定义序列化类。
- 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>最新版本</version>
<!--<version>1.2.55</version>-->
</dependency>
方法说明
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。
方法调用
public static void main(String[] args) {
User user=new User();
user.setId(2);
user.setEmail("8888@888.com");
user.setCreateTime(new Date());
String s = JSON.toJSONString(user);
User user1 = JSON.parseObject(s, User.class);
//因为需要转换是List所有json也是集合,所以最外面是【】
String b="["+s+"]";
List<User> users = JSON.parseArray(b, User.class);
}
实体类
代码同上实体类代码。
待转换Json串字段和实体字段相对应可直接转换,如果待转换Json串的字段为“Id”,实体字段为“id”,可以修改实体字段名称保持一致,也可以使用@JSONField(name="Id")
注释