import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
/**
* Object 转换为json字符串
* version:1.0
* @author root
*
*/
public class JSONUtil {
/**
* 对象转换为json。
* 1、得到object对象的类对象class
* 2、通过反射获得类的全部实例域,创建一个Stringbuffer,用来存储解析后的字符串。
* 3、循环遍历实例域数组,并判断其中是否有List类型、Set类型、Map类型、数组或者普通对象
* 4、如果是复杂类型就通过递归分析,直至是普通对象,然后将其解析成字符串,拼接在一起
* @param obj
* @return
*/
public static String obj2Json(Object obj){
Class clazz = obj.getClass();
Field[] fields=clazz.getDeclaredFields();
StringBuffer sb = new StringBuffer();
sb.append("{");
if (fields.length>0){
for (Field f:fields){
f.setAccessible(true);
try {
if(f.getType()==List.class||f.getType()==Set.class){
StringBuffer s = new StringBuffer();
s.append(foreachListAndSet(f.getName(),f.get(obj)));
sb.append(s);
}else if(f.getType()==Map.class){
StringBuffer s = new StringBuffer();
s.append(",\""+f.getName()+"\":");
s.append(analysisMap(f,obj));
sb.append(s);
}else if(Pattern.matches("^\\[.*", f.getType().getName())){
List list = new ArrayList<>();
for(int i=0;i<Array.getLength(f.get(obj));i++){
list.add(Array.get(f.get(obj), i));
}
StringBuffer s = new StringBuffer();
s.append(foreachListAndSet(f.getName(),list));
sb.append(s);
}else{
Object v = f.get(obj);
sb.append(",\""+f.getName()+"\":\""+v+"\"");
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
sb.append("}");
}
sb.deleteCharAt(1);
String json = sb.toString();
return json;
}
private static StringBuffer analysisMap(Field f,Object obj) throws IllegalArgumentException, IllegalAccessException{
StringBuffer s = new StringBuffer();
Map<?, ?> map = (Map<?, ?>)(f.get(obj));
s.append(foreachMap(f.getName(), map));
return s;
}
private static StringBuffer foreachMap(Object key,Object value){
StringBuffer s = new StringBuffer();
s.append("{");
Map<?, ?> map = (Map<?, ?>)value;
map.forEach((k,v)->{
if(Pattern.matches("^\\[.*", v.getClass().getName())){
List list = new ArrayList<>();
for(int i=0;i<Array.getLength(v);i++){
list.add(Array.get(v, i));
}
s.append(foreachListAndSet(k,list));
}else{
switch(v.getClass().getName()){
case "java.lang.Long":
case "java.lang.Integer":
case "java.lang.Byte":
case "java.lang.Short":
case "java.lang.Double":
case "java.lang.Float":
case "java.lang.Boolean":
case "java.lang.Character":
s.append(",\""+k+"\":\""+v+"\"");
break;
case "java.util.HashSet":
case "java.util.ArrayList":
s.append(foreachListAndSet(k,v));
break;
case "java.util.Map":
s.append(foreachMap(k,v));
break;
default:
String listObject = JSONUtil.obj2Json(v);
s.append(",\""+k+"\":"+listObject);
}
}
});
s.deleteCharAt(1);
s.append("}");
return s;
}
private static StringBuffer foreachListAndSet(Object k,Object v){
Collection<?> coll = (Collection<?>)v;
StringBuffer ss = new StringBuffer();
coll.forEach(action->{
if(Pattern.matches("^\\[.*", action.getClass().getName())){
List list = new ArrayList<>();
for(int i=0;i<Array.getLength(action);i++){
list.add(Array.get(action, i));
}
ss.append(foreachListAndSet("",list));
}else{
switch(action.getClass().getName()){
case "java.lang.Long":
case "java.lang.Integer":
case "java.lang.Byte":
case "java.lang.Short":
case "java.lang.Double":
case "java.lang.Float":
case "java.lang.Boolean":
case "java.lang.Character":
ss.append(",\""+action+"\"");
break;
case "java.util.HashSet":
case "java.util.ArrayList":
ss.append(foreachListAndSet(action.getClass().getName(),action));
break;
case "java.util.Map":
ss.append(foreachMap(k,v));
break;
default:
String listObject = JSONUtil.obj2Json(action);
ss.append(","+listObject);
}
}
});
ss.deleteCharAt(0);
if(k.equals("")){
ss.insert(0, ",[");
}else{
ss.insert(0, ",\""+k+"\":[");
}
ss.append("]");
return ss;
}
}
测试:自定义数据user对象中包含car对象、数组、集合
public class User {
private List<Car> cars=new ArrayList<>();
private String name;
private Integer age;
private Set<Car> carSet=new HashSet<>();
private List<Number> num=new ArrayList<>();
private Map<String, Object> map = new HashMap<>();
private Object[] numbers={new Car(),new Car(),1,2.3};
private List<Object> als=new ArrayList<>();
private Object[] obj = {new Car(),456,32.5};
//getter and setter methods 略
}
public class Car {
private String color;
private Integer num;
}
public class Test {
public static void main(String[] args) {
User u = new User();
Car c1 = new Car();
Car c2 = new Car();
Set<Car> carSet = new HashSet<>();
List<Car> list = new ArrayList<>();
c1.setColor("red");
c1.setNum(1);
c2.setColor("black");
c2.setNum(2);
carSet.add(c1);
carSet.add(c2);
list.add(c1);
list.add(c2);
u.setAge(20);
u.setName("zhangsan");
u.setCars(new LinkedList<Car>());
u.getCars().add(c1);
u.getCars().add(c2);
u.getNum().add(1);
u.getNum().add(2);
u.getNum().add(3.678);
u.getNum().add(4);
u.getCarSet().add(c1);
u.getCarSet().add(c2);
u.getMap().put("car1", c1);
u.getMap().put("car2",carSet);
u.getMap().put("car3", list);
Object[] objs={new Car(),123,4.54};
u.getMap().put("objs", objs);
u.getAls().add(u.getObj());
int lt1 = LocalTime.now().getNano();
String json = JSONUtil.obj2Json(u);
int lt2 = LocalTime.now().getNano();
System.out.println(lt2-lt1);
System.out.println(json);
}
}
测试结果:
{
"cars": [{
"color": "red",
"num": "1"
}, {
"color": "black",
"num": "2"
}],
"name": "zhangsan",
"age": "20",
"carSet": [{
"color": "red",
"num": "1"
}, {
"color": "black",
"num": "2"
}],
"num": ["1", "2", "3.678", "4"],
"map": {
"car2": [{
"color": "red",
"num": "1"
}, {
"color": "black",
"num": "2"
}],
"car3": [{
"color": "red",
"num": "1"
}, {
"color": "black",
"num": "2"
}],
"car1": {
"color": "red",
"num": "1"
},
"objs": [{
"color": "null",
"num": "null"
}, "123", "4.54"]
},
"numbers": [{
"color": "null",
"num": "null"
}, {
"color": "null",
"num": "null"
}, "1", "2.3"],
"als": [
[{
"color": "null",
"num": "null"
}, "456", "32.5"]
],
"obj": [{
"color": "null",
"num": "null"
}, "456", "32.5"]
}