使用ajax或easyui等框架时的Json-lib的处理方案

无论是使用ajax还是使用easyui等框架,后台向前台输出数据时都涉及到json处理的问题,这里介绍两种处理方法,第一种是手动配置json的处理方法,另一种使用json-lib的处理方案。普通手动配置方法比较笨拙,每次需要根据字段名逐个配置,因此也无法再其他对象上使用,降低了代码的重用性,使用json-lib工具可以实现自动处理,针对不同的对象采取不同的处理措施,同时可解决需要处理对象A与其他对象B的级联(一对多、多对多等)情况下的取值,避免陷入A=>B=>A=>B相互递归取值陷入死循环的问题,同时也大大提高了处理效率和代码的重用性,以下分别根据案例介绍两种方法的过程:

方法一:普通方法,通过手动配置转型的过程,以easyui的请求方法为例,前台通过dategrid向后台请求用户列表数据,数据中存在普通字段(int、String)数据,也有日期(date)数据,

jsp页面:

<table id="dg" title="用户管理" class="easyui-datagrid"
	fitColumns="true" pagination="true" rownumbers="true"
	url="${pageContext.request.contextPath}/user_list.action" fit="true" toolbar="#tb">
	<thead>
		<tr>
			<th field="cb" checkbox="true" align="center"></th>
			<th field="id" width="50" align="center">编号</th>
			<th field="trueName" width="80" align="center">真实姓名</th>
			<th field="userName" width="80" align="center">用户名</th>
			<th field="password" width="80" align="center">密码</th>
			<th field="sex" width="50" align="center">性别</th>
			<th field="birthday" width="100" align="center">出生日期</th>
			<th field="identityId" width="130" align="center">身份证</th>
			<th field="email" width="120" align="center">邮件</th>
			<th field="mobile" width="80" align="center">联系电话</th>
			<th field="address" width="100" align="center">家庭地址</th>
		</tr>
	</thead>
</table>

*******************************************************************************************************************************************************

action层:

public void list()throws Exception{
	PageBean pageBean=new PageBean(Integer.parseInt(page), Integer.parseInt(rows));
	List<User> userList=userService.findUserList(s_user, pageBean);
	Long total=userService.getUserCount(s_user);
	JSONObject result=new JSONObject();
	JSONArray jsonArray=JsonUtil.formatUserListToJsonArray(userList);
	//easyui接收属性为rows(数据内容)和total(总记录数)
	result.put("rows", jsonArray);
	result.put("total", total);
	//获取response对象
	ResponseUtil.write(ServletActionContext.getResponse(), result);
}

*******************************************************************************************************************************************************

util工具:

public class JsonUtil {
    /**
     * 将List结果集转化为JsonArray
     * @param gradeService
     * @param stuList
     * @return
     * @throws Exception
     */
    public static JSONArray formatUserListToJsonArray(List<User> userList)throws Exception{
        JSONArray array=new JSONArray();
        for(int i=0;i<userList.size();i++){
            User user=userList.get(i);
            JSONObject jsonObject=new JSONObject(); 
            jsonObject.put("userName", user.getUserName());      //需手动逐个配置json的key-code
            jsonObject.put("password", user.getPassword());
            jsonObject.put("trueName", user.getTrueName());
            jsonObject.put("sex", user.getSex());
            jsonObject.put("birthday", DateUtil.formatDate((user.getBirthday()), "yyyy-MM-dd"));
            jsonObject.put("identityId", user.getIdentityId());
            jsonObject.put("email", user.getEmail());
            jsonObject.put("mobile", user.getMobile());
            jsonObject.put("address", user.getAddress());
            jsonObject.put("id", user.getId());
            array.add(jsonObject);
        }
        return array;
    }
}

方法二:使用jsonLib工具完成处理,以easyui的请求方法为例,前台通过dategrid向后台请求商品列表数据,数据中存在普通字段(int、String)数据,也有日期(date)数据,同时商品对象(Product)还级联了类别对象(ProductType)

jsp页面:

<table id="dg" title="商品管理" class="easyui-datagrid"
fitColumns="true" pagination="true" rownumbers="true"
	url="${pageContext.request.contextPath}/product_list.action" fit="true" toolbar="#tb">
	<thead>
	<tr>
		<th field="cb" checkbox="true" align="center"></th>
		<th field="id" width="50" align="center" hidden="true">编号</th>
		<th field="proPic" width="60" align="center" formatter="formatProPic">商品图片</th>
		<th field="name" width="150" align="center">商品名称</th>
		<th field="price" width="50" align="center">价格</th>
		<th field="stock" width="50" align="center">库存</th>
		<th field="smallType.id" width="100" align="center" formatter="formatTypeId" hidden="true">所属商品类id</th>
		<th field="smallType.name" width="100" align="center" formatter="formatTypeName">所属商品类</th>
		<th field="description" width="50" align="center" hidden="true">描述</th>
		<th field="hotTime" width="50" align="center" hidden="true">上架时间</th>
	</tr>
	</thead>
</table>

*******************************************************************************************************************************************************

action层:

public void list() throws Exception{
	PageBean pageBean=new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
	List<Product> productList=productService.getProducts(s_product, pageBean);
	long total=productService.getProductCount(s_product);
		
	//使用jsonLib工具将list转为json
	JsonConfig jsonConfig=new JsonConfig();
	jsonConfig.setExcludes(new String[]{"orderProductList"});  //不需要处理字段需要标记
	jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd"));  //处理日期
	jsonConfig.registerJsonValueProcessor(ProductType.class,new ObjectJsonValueProcessor(new String[]{"id","name"}, ProductType.class));  //处理类别list对象
	JSONArray rows=JSONArray.fromObject(productList, jsonConfig);
	JSONObject result=new JSONObject();
	result.put("rows", rows);
	result.put("total", total);
	ResponseUtil.write(ServletActionContext.getResponse(), result);
}

*******************************************************************************************************************************************************

util工具:

/**
 * json-lib 日期处理类
 * @author Administrator
 *
 */
public class DateJsonValueProcessor implements JsonValueProcessor{

	private String format;  
	
    public DateJsonValueProcessor(String format){  
        this.format = format;  
    }  
    
	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
		// TODO Auto-generated method stub
		return null;
	}

	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
		if(value == null)  
        {  
            return "";  
        }  
        if(value instanceof java.sql.Timestamp)  
        {  
            String str = new SimpleDateFormat(format).format((java.sql.Timestamp)value);  
            return str;  
        }  
        if (value instanceof java.util.Date)  
        {  
            String str = new SimpleDateFormat(format).format((java.util.Date) value);  
            return str;  
        }  
          
        return value.toString(); 
	}

}

/**
 * 解决对象级联问题
 * @author Administrator
 *
 */
public class ObjectJsonValueProcessor implements JsonValueProcessor{

	/**
	 * 保留的字段
	 */
	private String[] properties;  
	
	/**
	 * 处理类型
	 */
	private Class<?> clazz;  
	
	/**
	 * 构造方法 
	 * @param properties
	 * @param clazz
	 */
	public ObjectJsonValueProcessor(String[] properties,Class<?> clazz){  
        this.properties = properties;  
        this.clazz =clazz;  
    }  
	
	public Object processArrayValue(Object arg0, JsonConfig arg1) {
		// TODO Auto-generated method stub
		return null;
	}

	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
		PropertyDescriptor pd = null;  
        Method method = null;  
        StringBuffer json = new StringBuffer("{");  
        try{  
            for(int i=0;i<properties.length;i++){  
                pd = new PropertyDescriptor(properties[i], clazz);  
                method = pd.getReadMethod();  
                String v = String.valueOf(method.invoke(value));  
                json.append("'"+properties[i]+"':'"+v+"'");  
                json.append(i != properties.length-1?",":"");  
            }  
            json.append("}");  
        }catch (Exception e) {  
            e.printStackTrace();  
        }  
        return JSONObject.fromObject(json.toString());  
	}

}





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值