1.背景

   借鉴与php中 app接口的实现(php写app接口生成xml和json数据),封装了java版的json和xml数据操作类!


2.准备

   在使用之前,需要引入 json 的jar 包:点我下载 !

   这里实现了,对象转json , 对象集合转json, 对象转xml,对象集合转xml ;


3.appUtil 工具类实现

    具体的实现过程,我就不解释了,一边写,一边测试!直到写成为止!

    里面的 tojsonArray() 方法 没有使用,可以删除,不过想生成json数组的 ,就不需要删除了!

  

package Interface.app.Util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;


public class AppUtil {

	 //默认值
	 private static final String JSON="json";
	 private static final String XML="xml";
	 
	 /**
	  *  工具类入口
	  * @param code 状态码
	  * @param msg  提示信息
	  * @param obj  返回数据
	  * @param type 数据类型   json / xml
	  * @return  字符串
	  */
	public static String toPrint(int code,String msg,Object obj,String type){
		 
		 //大小写不影响
		 String str="";
		 
		 if(JSON.equalsIgnoreCase(type)&&JSON.equals(type)){
			//生成json数据
			 str=toJsonString(code, msg, obj);
			 
		 }else if(XML.equalsIgnoreCase(type)&&XML.equals(type)){
			//生成xml数据
			 str=toXml(code, msg, obj);
			 
		 }else{
			 //默认使用 json , 参数错误的话 ,默认 为json
			 str=toJsonString(code, msg, obj);
		 }
			 
		return str;
	 }
	 
	
     /**
      * 对象转 json 数组 
      * @param code 状态码
      * @param msg  状态信息
      * @param obj  数据
      * @return json数组 字符串
      */
	 @SuppressWarnings("unused")
	private static String toJsonArray(int code,String msg,Object obj){
		 
		 Map<String, Object> map=toKeyVal(code, msg, obj);
		 
		 JSONArray jsonArray=JSONArray.fromObject(map);
		 return jsonArray.toString();
	 }
	 
	 /**
	  *  这一个就够了!
	  *  
	  * 转 json 对象 
	  * @param code 状态码
	  * @param msg  提示信息
	  * @param obj  数据
	  * @return json对象 字符串
	  */
	 private static String toJsonString(int code,String msg,Object obj){
		 
		 if(obj==null) {
				obj="";
			}
		 
		 Map<String, Object> map=toKeyVal(code, msg, obj);
		 
		 JSONObject jsonObject=JSONObject.fromObject(map);
		 return jsonObject.toString();
	 }
	 
	 /**
	  *  转xml 格式 :字符串拼装的格式 
	  * @param code 状态码
	  * @param msg  提示信息
	  * @param obj  数据
	  * @return xml数据
	  */
	 private static String toXml(int code,String msg,Object obj){
		 
		if(obj==null) {
			obj="";
		}
		 
    	Map<String,Object> map=toKeyVal(code, msg, obj);
	    JSONObject object=JSONObject.fromObject(map);
		 
		 StringBuilder builder=new StringBuilder("<?xml version='1.0' encoding='UTF-8'?>");
		 builder.append("<root>");
		 builder.append(mapToxml(object));
		 builder.append("</root>");
		 
		return builder.toString();
	 }
	 
	 
	 /**
	  * 用来封装数据
	  * @param code 状态码
	  * @param msg  信息
	  * @param obj 数据
	  * @return
	  */
	private static Map<String, Object> toKeyVal(int code,String msg,Object obj){
		 
		Map<String,Object> map=new HashMap<String, Object>();
		map.put("code", code);
		map.put("msg", msg);
		map.put("data", obj);
		
		return map;
	 }
	
	
	
	
	
	/**
	 * 生成 xml
	 * @param object
	 * @return
	 */
	private static String mapToxml(JSONObject object){

		
		StringBuilder builder=new StringBuilder();
		
		@SuppressWarnings("unchecked")
		Iterator<String> iterator=object.keys();
		
	    while(iterator.hasNext()){
	    	
	    	String key=iterator.next();

	    	builder.append("<"+key+">");
	    	
	    	if(object.get(key) instanceof JSONObject){
	    		//如果是 JSONObject的话
	    		//递归 调用
	    		builder.append(mapToxml((JSONObject) object.get(key)));
	    	}else if(object.get(key) instanceof JSONArray){
	    		//如果是 JSONArray的话 
	    		StringBuilder builder2=new StringBuilder();
	    		JSONArray array=(JSONArray) object.get(key);
	    		
	    		if(array.isArray()){
	    			int i=0;
	    		   for(Object obj : array) {
	    			   JSONObject objitem=(JSONObject) obj;
	    			   String attr="num='"+i+"'";
	    			   
	    			   //如果有 id 的话 ,可以使用这个
//	    			   if(objitem.containsKey("id")){
//	    				   attr="id='"+objitem.getString("id")+"'";
//	    			   }
	    			   
	    			   builder2.append("<item "+attr+">");
					   builder2.append(mapToxml(objitem));
					   builder2.append("</item>");
					   i++;
				    }
	    		}
	    		builder.append(builder2.toString());
	    		
	    		
	    	}else{
	        	builder.append(object.get(key));
	    	}
	    	
	    	builder.append("</"+key+">");
	    }
		
		return builder.toString();
	}
	
	 
	
}


4. 使用

  使用URL 传 type 参数 , 或者你调用的时候,将 type的值 写 固定!

   1) type=json : 生成json数据 ,

   2)type=xml : 生成xml数据 , 

   3)不传参或者 type传其他值,均为默认值

 示例格式:

http://localhost:8080/TennisGameSys/App_GetgameById?type=json&id=2

   4)在这里实现调用时 servlet 里,通过doGet() 方法中实现

  public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
          //设置编码
	  request.setCharacterEncoding("UTF-8");
          response.setCharacterEncoding("UTF-8");
          //获取 url参数
          String id=request.getParameter("id");
          String type=request.getParameter("type");
                  //查询数据库
                  GameManager gm=new GameManagerImpl();
		  Game g=gm.getGameById(Integer.parseInt(id));
		  //封装数据
		  String strs= AppUtil.toPrint(1,"success",g, type);
		  response.setContentType("text/"+type);
		  //输出数据
		  PrintWriter out=response.getWriter();
		  out.print(strs);
		  out.flush();
		  out.close();
	}


    测试结果:

{"data":{"competitorNum":30,"enrollDeadLine":"2015.8.1","gameLocation":"郑州体育中心","gamename":"百事创新网球大赛","gametime":"2015.8.26","id":2,"personNum":2},"code":1,"msg":"success"}



5.工具类下载

      http://download.csdn.net/detail/lablenet/9002325



GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐