================================
©Copyright 蕃薯耀 2020-01-07
https://www.cnblogs.com/fanshuyao/
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sf.ezmorph.Morpher;
import net.sf.ezmorph.MorpherRegistry;
import net.sf.ezmorph.bean.BeanMorpher;
import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.JSONUtils;
public class JsonUtils {
@SuppressWarnings("unchecked")
public static <T> T toClass(String json, Class<T> clazz){
return (T) JSONObject.toBean(JSONObject.fromObject(json), clazz);
}
public JsonUtils() {
}
public static String toJson(Object obj) {
String s = "{}";
if (obj == null) {
return s;
}
if (!(obj instanceof Collection) && !(obj.getClass().isArray()) && !(obj instanceof JSONArray)) {
s = JSONObject.fromObject(obj, config).toString();
} else {
s = JSONArray.fromObject(obj, config).toString();
}
return s;
}
/**
* json轉換成Bean,clazz指定的整個json轉換的類型
* 如果這個bean裡面還有其他自定義類型(List,Array不包括,會自動轉換)不知道如何轉換隻能用MorphDynaBean
* 解決辦法請看jsonToBean(String s, Class clazz, Map map)中的map來指定類型
* jsonToBean隻适合JsonObject,isArray為true不滿足,json形式最外層為{}而不能為[]
*/
public static Object jsonToBean(String s, Class<?> clazz) {
return jsonToBean(s, clazz, null);
}
public static Object jsonToBean(String s, Class<?> clazz, Map<String,?> typemap) {
return trans2Bean(JSONObject.fromObject(s), clazz, typemap);
}
private static Object trans2Bean(JSONObject jsonobject, Class<?> class1, Map<String,?> map) {
return JSONObject.toBean(jsonobject, class1, map);
}
/**
* 将MorphDynaBean類型的對象轉換成指定的類型對象
*/
public static Object translateMorphDynaBean(Class<?> outclazz, Object obj) {
MorpherRegistry morpherRegistry = JSONUtils.getMorpherRegistry();
Morpher dynaMorpher = new BeanMorpher(outclazz,morpherRegistry);
morpherRegistry.registerMorpher(dynaMorpher);
return morpherRegistry.morph(outclazz,obj);
}
@SuppressWarnings("rawtypes")
public static List jsonArrayToList(String json) {
return JSONArray.fromObject(json);
}
/**
* 将最外層為[]的json轉換成List對象
* jsonToBean隻适合json最外層為{}形式
* 可以指定class,裡面元素形式為{} 将元素轉換成指定類型 [{},{}]
* 但是要求裡面元素必須是{}包含,如果如[[],[]]json形式不适合JsonObject
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List jsonArrayToList(String json, Class clazz) {
if (json == null || "".equals(json)) {
return null;
}
if (clazz == null) {
return JSONArray.fromObject(json);
}
List arraylist = new ArrayList();
for (Iterator iterator = JSONArray.fromObject(json).iterator(); iterator.hasNext(); ) {
arraylist.add(trans2Bean(((JSONObject) iterator.next()), clazz, null));
};
return arraylist;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static List jsonArrayToList(String json,Class clazz, Map mapType) {
if (json == null || "".equals(json)) {
return null;
}
if (clazz == null) {
return JSONArray.fromObject(json);
}
List arraylist = new ArrayList();
for (Iterator iterator = JSONArray.fromObject(json).iterator(); iterator.hasNext(); ) {
arraylist.add(trans2Bean(((JSONObject) iterator.next()), clazz, mapType));
};
return arraylist;
}
/**
* jsonToMap可以用jsonToBean來代替
* @param s
* @return
*/
@SuppressWarnings("rawtypes")
public static Map jsonToMap(String json) {
return JSONObject.fromObject(json);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map jsonToMap(String json, Class class1) {
if(json == null || "".equals(json)) {
return null;
}
JSONObject jsonobject = JSONObject.fromObject(json);
HashMap hashmap = new HashMap();
String s1 = null;
for (Iterator iterator = jsonobject.keys(); iterator.hasNext(); ) {
s1 = (String) iterator.next();
hashmap.put(s1,trans2Bean(jsonobject.getJSONObject(s1), class1, null));
}
return hashmap;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Map jsonToMap(String json, Class class1, Map map) {
if(json == null || "".equals(json)) {
return null;
}
JSONObject jsonobject = JSONObject.fromObject(json);
HashMap hashmap = new HashMap();
String s1;
for (Iterator iterator = jsonobject.keys(); iterator.hasNext(); ) {
s1 = (String) iterator.next();
hashmap.put(s1,trans2Bean(jsonobject.getJSONObject(s1), class1, map));
}
return hashmap;
}
public static String escape(String s) {
Pattern pattern = Pattern.compile("[\\\\|'|\\r|\\n]");
Matcher matcher = pattern.matcher(s);
StringBuffer stringbuffer = new StringBuffer();
while (matcher.find())
if ("\\".equals(matcher.group()))
matcher.appendReplacement(stringbuffer, "\\\\\\\\");
else if ("'".equals(matcher.group()))
matcher.appendReplacement(stringbuffer, "\\\\'");
else if ("\r".equals(matcher.group()))
matcher.appendReplacement(stringbuffer, "\\\\r");
else if ("\n".equals(matcher.group()))
matcher.appendReplacement(stringbuffer, "\\\\n");
matcher.appendTail(stringbuffer);
return stringbuffer.toString();
}
private static final JsonConfig config;
static {
config = new JsonConfig();
//使用jsonConfig的setCycleDetectionStrategy()方法進行忽略死循環。
//bK.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
//需要注意的是完整的放到最前面,如果簡單的放到前面,比對範圍變大了如:yyyy-MM-dd 比對2012-05-21 13:13:11
JSONUtils.getMorpherRegistry()
.registerMorpher(new DateMorpher(new String[] {"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"}));
//時間如java.sql.Date的處理
config.registerJsonValueProcessor(java.sql.Date.class, new DateJsonValueProcessor("yyyy-MM-dd"));
//時間為java.util.Date處理
config.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
//時間為java.sql.Timestamp處理
config.registerJsonValueProcessor(java.sql.Timestamp.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
//時間為java.math.BigDecimal處理
config.registerJsonValueProcessor(java.math.BigDecimal.class, new NumberJsonValueProcessor());
}
// 時間轉換内部類
public static class DateJsonValueProcessor implements JsonValueProcessor {
private static final String defaultFormat = "yyyy-MM-dd";
private DateFormat dataFormat;
// 構造函數
public DateJsonValueProcessor() {
dataFormat = new SimpleDateFormat(defaultFormat);
}
public DateJsonValueProcessor(String s) {
dataFormat = new SimpleDateFormat(s);
}
//如果是List<Date>類型,這裡面obj值得是集合一個元素Date
public Object processArrayValue(Object obj, JsonConfig jsonconfig) {
return process(obj);
}
@Override
public Object processObjectValue(String s, Object obj, JsonConfig jsonconfig) {
return process(obj);
}
//如果是java.sql.Date類型,這裡強轉是否會存在問題
//這裡因為Date是java.util.Date類型,java.sql.Date是java.util.Date的子類
//自動向上轉型可以知道,這裡強轉是合理的
private Object process(Object obj) {
return obj != null ? dataFormat.format((Date)obj) : "";
}
}
//BigDecimal轉換為Json發生截斷 處理
public static class NumberJsonValueProcessor implements JsonValueProcessor {
@Override
public Object processArrayValue(Object obj, JsonConfig jsonconfig) {
return process(obj);
}
@Override
public Object processObjectValue(String s, Object obj, JsonConfig jsonconfig) {
return process(obj);
}
private Object process(Object obj) {
return obj != null ? obj.toString() : "";
}
}
}
(如果你覺得文章對你有幫助,歡迎捐贈,^_^,謝謝!)
今天越懶,明天要做的事越多。