Maven
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
package com.bood.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import com.alibaba.fastjson.serializer.ValueFilter;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
/**
* Alibaba - JSON對象工具類
*
* @author:bood
* @since:2020/2/9
*/
public final class JsonUtils {
private JsonUtils() {
}
/***
* 值過濾器
*/
private static ValueFilter filter = new ValueFilter() {
@Override
public Object process(Object obj, String s, Object v) {
if (v == null) {
return "";
}
return v;
}
};
private static SerializerFeature[] feature = {
//解決FastJson循環引用的問題
SerializerFeature.DisableCircularReferenceDetect,
//輸出值爲null的字段
SerializerFeature.WriteMapNullValue
};
private static SerializeConfig mapping = new SerializeConfig();
static {
mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
// 數據庫的一個時間類型
mapping.put(Timestamp.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
}
/**
* 將對象轉換成JSON字符串 --固定時間格式"yyyy-MM-dd HH:mm:ss"
*
* @param BO/VO,map,數組,list 對象
* @return JSON字符串
* @說明:對bean中有Date類型的數據可以成功轉換成yyyy-MM-dd HH:mm:ss格式的時間類型,例如:"barDate":yyyy-MM-dd HH:mm:ss
*/
public static String getJsonByObj(Object bean) {
return getJsonByObj(bean, mapping);
}
/**
* 將對象轉換成JSON字符串 --特定時間格式--所有Key爲小寫
*
* @param BO/VO,map,數組,list 對象
* @return JSON字符串
* @dateType 時間格式轉換後的字符串格式,例如yyyy-MM-dd HH:mm:ss
* @說明:對bean中有Date類型的數據可以成功轉換成yyyy-MM-dd HH:mm:ss格式的時間類型,例如:"barDate":yyyy-MM-dd HH:mm:ss
*/
public static String getJsonByObj(Object bean, String dateType) {
SerializeConfig zdymapping = new SerializeConfig();
zdymapping.put(Date.class, new SimpleDateFormatSerializer(dateType));
return getJsonByObj(bean, zdymapping);
}
/**
* 將對象轉換成JSON字符串 ---效率高一些--不處理key 也不處理循環引用的問題--也不處理時間格式
*
* @param BO/VO,map,數組,list 對象
* @return JSON字符串
* @說明:對bean中有Date類型的數據可以成功轉換成long格式的時間類型,例如:"barDate":1458268099098
*/
public static String getJsonDefaultByObj(Object bean) {
return JSON.toJSONString(bean);
}
/**
* 將JSON數據轉換爲ListBean集合
*
* @param <T>
* @param json JSON數組數據
* @param calzz 待轉換的Bean類型 --LinkedCaseInsensitiveMap
* @return
*/
public static <T> List<T> getListBean(String json, Class<T> calzz) {
return JSON.parseArray(json, calzz);
}
/**
* 將JSON數據轉換爲List集合
*
* @param <T>
* @param json JSON數組數據
* @param calzz 待轉換的Bean類型 --LinkedCaseInsensitiveMap
* @return
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public static List getList(String json, Class calzz) {
return getListBean(json, calzz);
}
/**
* 將JSON數據轉換爲 Java Bea n對象
*
* @param json JSON字符串
* @param calzz 待轉換的Bean類型--LinkedCaseInsensitiveMap
* @return
*/
public static <T> T getObjet(String json, Class<T> calzz) {
return JSON.parseObject(json, calzz);
}
/***
* 通用封裝--獲取json字符串
* @param bean 對象
* @param mappingx 時間類型計劃等
* @return
*/
private static String getJsonByObj(Object bean, SerializeConfig mappingx) {
String json = JSON.toJSONString(bean, mappingx, filter, feature);
json = stringToJson(json);
// 所有Key爲小寫
return json;
}
/**
* 當文本中含有如下特殊字符時,此方法可以成功處理,讓其在前臺被正確解析,注意:此法不能處理單引號
*
* @param s
* @return
*/
public static String stringToJson(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
/*case '\"':
sb.append("\\\"");
break;*/
// 如果不處理單引號,可以釋放此段代碼,若結合下面的方法處理單引號就必須註釋掉該段代碼
case '\\':
sb.append("\\\\");
break;
case '/':
sb.append("\\/");
break;
//退格
case '\b':
sb.append("\\b");
break;
//走紙換頁
case '\f':
sb.append("\\f");
break;
//換行
case '\n':
sb.append("\\n");
break;
//回車
case '\r':
sb.append("\\r");
break;
//橫向跳格
case '\t':
sb.append("\\t");
break;
default:
sb.append(c);
}
}
return sb.toString();
}
}