之前因为返回到iPhone客户端和android客户端的json格式中许多值是null值,界面去key显示出来的值就为null,很不友好。手机端开发者表示要把null转为“”暂时没有办法。
于是就交给了服务器端,在网上找了http://wuliaolll.iteye.com/blog/1868205这篇文章,我们采用的是springmvc3.0.5.release和spring3.0.5这个版本。对于文章上的方法试过几次,改过几次,都无效,初步认为是springmvc或者spring的bug,如果有知道原因的请回复我,让大家都了解了解。如果大家用http://wuliaolll.iteye.com/blog/1868205 这篇文章的方法无效,不放试试我的解决方法。
最后解决方案如下:
ObjectMappingCustomer.java
package javacommon.util; import org.codehaus.jackson.JsonGenerator;import org.codehaus.jackson.JsonProcessingException;import org.codehaus.jackson.map.JsonSerializer;import org.codehaus.jackson.map.ObjectMapper;import org.codehaus.jackson.map.SerializerProvider; import java.io.IOException; /** * Date: 13-11-13 * Time: 上午9:01 */public class ObjectMappingCustomer extends ObjectMapper { public ObjectMappingCustomer() { super(); // 空值处理为空串 this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize( Object value, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException { jg.writeString(""); } }); }}
JsonUtil.java 这个类是我从项目抽出来的,方便直接使用. 后面我会贴出项目中用的类,方便借鉴运用
package com.test; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.JsonGenerationException;import org.codehaus.jackson.map.JsonMappingException;import org.codehaus.jackson.map.ObjectMapper; public class JsonUtil { private static ObjectMappingCustomer objectMappingCustomer = new ObjectMappingCustomer(); private static ObjectMapper objectMapper; /** * 把jackson null转为""串 * @param response * @param object */ @SuppressWarnings("unused") public static void WriteNullToString(HttpServletResponse response,Object object) { response.setContentType("application/json"); try { if(false) {//如果为true,表示允许返回的json为null,具体值可以配置到配置文件然后读取,以后要改就不用改源码了 if (objectMapper == null) { objectMapper = new ObjectMapper(); } response.getWriter().write(objectMapper.writeValueAsString(object)); }else { response.getWriter().write(objectMappingCustomer.writeValueAsString(object)); } } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
有了上面两部就可以运用了,贴一个实际代码出来参考.
运用到实际项目中的实现
MobileResult.java
package com.wallaw.portal.model; import java.io.IOException;import java.util.HashMap;import java.util.Map; import javacommon.util.ObjectMappingCustomer;import javacommon.util.PublicCode;import javacommon.util.StringUtil; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger;import org.codehaus.jackson.JsonGenerationException;import org.codehaus.jackson.map.JsonMappingException;import org.codehaus.jackson.map.ObjectMapper; /** * Date: 13-4-26 * Time: 下午1:56 * 返回手机客户端通用类 */public class MobileResult { private String resultCode; private String returnMsg; private Map resultObject; private static ObjectMappingCustomer objectMappingCustomer; private static ObjectMapper objectMapper; private static final Logger LOG = Logger.getLogger(MobileResult.class); public MobileResult() { resultObject = new HashMap(); } public String getResultCode() { return resultCode; } public void setResultCode(String resultCode) { this.resultCode = resultCode; } public String getReturnMsg() { return returnMsg; } public void setReturnMsg(String returnMsg) { this.returnMsg = returnMsg; } public Map getResultObject() { return resultObject; } public void setResultObject(Map resultObject) { this.resultObject = resultObject; } public static void setObjectMappingCustomer( ObjectMappingCustomer objectMappingCustomer) { MobileResult.objectMappingCustomer = objectMappingCustomer; } public void WriteJsonToResponse(HttpServletResponse response) { response.setContentType("application/json"); try { if(StringUtil.toBoolean(PublicCode.getCommConfigMap().get("enable.jsonnull"), false)) { if (objectMapper == null) { objectMapper = new ObjectMapper(); } response.getWriter().write(objectMapper.writeValueAsString(this)); }else { response.getWriter().write(objectMappingCustomer.writeValueAsString(this)); } } catch (JsonGenerationException e) { LOG.error("WriteJsonToResponse查询失败:", e); } catch (JsonMappingException e) { LOG.error("WriteJsonToResponse查询失败:", e); } catch (IOException e) { LOG.error("WriteJsonToResponse查询失败:", e); } }}
贴一个controller,看了就应该明白上面的代码
/* * Powered By [rapid-framework] * Web Site: http://www.rapid-framework.org.cn * Google Code: http://code.google.com/p/rapid-framework/ * Since 2008 - 2013 */ package com.wallaw.portal.controller; import java.util.List; import javacommon.base.BaseRestSpringController;import javacommon.util.CollectionUtil;import javacommon.util.Constants; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping; import com.wallaw.portal.model.MobileResult;import com.wallaw.portal.model.Test;import com.wallaw.portal.service.ProductStatusManager;import com.wallaw.portal.vo.query.ProductStatusQuery; /** * @version 1.0 * @since 1.0 */ @Controller@RequestMapping("/test")public class TestController extends BaseRestSpringController<Test,java.lang.Integer>{ private ProductStatusManager productStatusManager; public void setProductStatusManager(ProductStatusManager productStatusManager) { this.productStatusManager = productStatusManager; } /*-----------------------------------------------------手机端接口--------------------------------------------------------------------*/ /** * 每日推荐列表 */ @RequestMapping(value="mobile/list")//去除了@ResponseBody public void list(ModelMap model,ProductStatusQuery productStatusquery, HttpServletResponse response){ MobileResult mobileResult = new MobileResult(); mobileResult.setResultCode(Constants.FAILURE_CODE); mobileResult.setReturnMsg(Constants.FAILURE); //查金融推荐产品 List productList = productStatusManager.getProductListWithRecommend(productStatusquery); //计算总数 int count = CollectionUtil.isEmpty(productList)?0:productList.size(); if(count!=0){ mobileResult.setResultCode(Constants.SUCCESS_CODE); mobileResult.setReturnMsg(Constants.SUCCESS); mobileResult.getResultObject().put("productList", productList); mobileResult.getResultObject().put("count", count); } mobileResult.WriteJsonToResponse(response);//利用response.getWriter().write(String)把json返回给手机端 } }
返回结果如下图:
网上没有找到相关的实现,自己实现之后就写下来了,希望对大家有用。
Original url: Access
Created at: 2020-07-15 16:37:44
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论