自定义JSONUtil对象

 

Sturts2漏洞越来越多,所以博主特地放弃了Struts2,

 

开始使用Spring MVC,虽然各种不适应,但是还是解决了不少问题

 

为了解决Spring MVC和Json不和谐的问题,特地自己写了个JSONUtil对象,方便进行前台交互。

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class JSONUtil {
	public static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
	
	public static String serialize(Object o,StringBuffer s,Class<?>... parseClazz) throws Exception{
		Class<?> clazz = o.getClass();
		
		List<Class<?>> context = new ArrayList<Class<?>>();
		for(Class<?> c :parseClazz){
			context.add(c);
		}
		
		if(clazz.isArray()){
			s.append("[");
			for(Object sub:(Object[])o){
				JSONUtil.covert(sub, context, s, parseClazz);
				s.append(",");
			}
			s.delete(s.length()-1, s.length());
			s.append("]");
		} else if(o instanceof Collection<?>){
			s.append("[");
			
			Collection<?> collection = (Collection<?>) o;
			for(Iterator<?> iterator = collection.iterator();iterator.hasNext();){
				JSONUtil.covert(iterator.next(), context, s, parseClazz);
				s.append(",");
			}
			s.delete(s.length()-1, s.length());
			s.append("]");
		} else {
			s=JSONUtil.covert(o, context, s, parseClazz);
		}
		return s.toString();
	}
	
	private static StringBuffer covert(Object o,List<Class<?>> context,StringBuffer s,Class<?>... parseClazz) throws Exception{
		Class<?> clazz = o.getClass();
		s.append("{");
		
		PropertyDescriptor[] props = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
		for (PropertyDescriptor prop : props) {
			
			if (prop.getReadMethod() != null && prop.getReadMethod().invoke(o) != null&& !"class".equals(prop.getDisplayName())) {
				
				s.append("\"").append(prop.getName()).append("\"").append(":");
				
				Object value = prop.getReadMethod().invoke(o);
				
				if(prop.getPropertyType() == String.class
						|| prop.getPropertyType() == Boolean.class
						|| prop.getPropertyType() == boolean.class
						|| prop.getPropertyType() == Character.class
						|| prop.getPropertyType() == char.class){
					s.append("\"").append(value).append("\"");
				} else if (isWrapClass(prop.getPropertyType())
						|| prop.getPropertyType().isPrimitive()){
					s.append(value);
				} else if(value.getClass() == java.util.Date.class || value.getClass() == java.sql.Date.class || value.getClass() == java.sql.Timestamp.class){
					s.append("\"").append(new SimpleDateFormat(DATE_FORMAT).format(value)).append("\"");
				} else if(prop.getPropertyType() == clazz){
					s.delete(s.lastIndexOf(","), s.length());
				} else if(context.contains(prop.getPropertyType())
						|| (value.getClass().isArray() && ((Object[])value).length>0 && context.contains(((Object[])value)[0].getClass()))
						|| value instanceof Collection<?>){
					JSONUtil.serialize(value,s,parseClazz);
				} else {
					s.delete(s.lastIndexOf(","), s.length());
				}
				s.append(",");
			}
		}
		
		s.delete(s.length()-1, s.length());
		s.append("}");
		
		return s;
	}
	
	private static boolean isWrapClass(Class<?> clazz){  
	    try {  
	        return ((Class<?>)clazz.getField("TYPE").get(null)).isPrimitive();
	    } catch (Exception e){  
	        return false;  
	    }  
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值