JAVA操作JSON格式数据


由于近些日子公司在弄微信项目,而微信官方API所提供的接口当中,有些需要以POST方式进行请求,且数据传输格式要求为JSON格式数据,之前没怎么研究过,而且传递的数据格式相对也比较简单,所以直接都是采用的字符串拼接的方式进行组装的,之后再用String.format格式化一下就好了。


		//需要提交的json数据
		String jsonData = "{\"openid\":\"%s\",\"to_groupid\":%d}";
		//调用接口移动用户分组
		JSONObject jsonObject = WeixinUtil.httpRequest(requestUrl, "POST", String.format(jsonData, openId,groupId));


但是,今天用到消息模板接口的时候,发现POST请求的数据有点多,如果还是用这种方式就显得有些麻烦了,而且也不是很直观,需要对双引号做转义操作,有的时候转多了看着就头晕。所以特定查了一翻资料自己研究了一下。


首先,因为要用到json,所以项目中先要导入json开发工具包,用于Java对象和Json字符串之间的转换;

json开发工具包一共有3个jar:ezmorph-1.0.6.jar,json-lib-2.2.3-jdk13.jar和morph-1.1.1.jar。

这三个jar工具包已经上传至CSDN。有需要的话可以去下载:

http://download.csdn.net/detail/hu1991die/8401677


示例代码:

package com.json;

import java.util.Iterator;

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

/**
 * Java操作JSON格式数据
 * @author feizi
 * @time 2015-1-27下午5:36:13
 */
public class TestJSON {

	public static void main(String[] args) {
	    //jsonObject:{"right":"right","left":"left","obj":{"second":"222","third":"333"},"ele":{"four":"444","five":"555"},"data":[{"name":"张三","age":"23","sex":"男"},{"name":"李三","age":"20","sex":"女"}]}
	    JSONObject jsonObject = TestJSON.createJSONObject();
	    // 输出jsonobject对象  
	    System.out.println("jsonObject:" + jsonObject);  
	    
	    // 根据key返回一个字符串  
	    String right = jsonObject.getString("right");  
	    System.out.println("right==>" + right); //right==>right
	    
	    JSONObject obj = (JSONObject) jsonObject.get("obj");
	    System.out.println("obj==>"+obj);//obj==>{"second":"222","third":"333"}
	    
	    String second = (obj == null ? "" : (String)obj.get("second"));
	    System.out.println("second==>" + second); //second==>222
	    
	    JSONArray array = jsonObject.getJSONArray("data");
	    System.out.println("array==>"+array);//array==>[{"name":"张三","age":"23","sex":"男"},{"name":"李三","age":"20","sex":"女"}]
	    
	    if(!array.isEmpty()){
	    	for(int i = 0; i < array.size(); i++){
	    		//{"name":"张三","age":"23","sex":"男"}
	    		//{"name":"李三","age":"20","sex":"女"}
	    		JSONObject element = (JSONObject) array.get(i);//array.get(i)方法默认返回的是Object类型,需要造型成JSONObject类型才能取出key值
	    		System.out.println("element==>"+element);
	    		
	    		String name = (String)element.get("name");
	    		String age = (String)element.get("age");
	    		String sex = (String)element.get("sex");
	    		
	    		//name==>张三
	    		//age==>23
	    		//sex==>男
	    		//name==>李三
	    		//age==>20
	    		//sex==>女
	    		System.out.println("name==>"+name);
	    		System.out.println("age==>"+age);
	    		System.out.println("sex==>"+sex);
	    	}
	    	
	    	//或者用iterator迭代器进行迭代
	    	for (Iterator<Object> iterator = array.iterator(); iterator.hasNext();) {
	    		JSONObject element = (JSONObject) iterator.next();
	    		System.out.println("element==>"+element);
	    		//之后和上面一样
	    	}
	    	
	    }
	}
	
	public static JSONObject createJSONObject(){
		JSONObject jsonObject = new JSONObject();
		
		//一般格式
		//jsonObject:{"right":"right","left":"left"}
		jsonObject.put("right", "right");
		jsonObject.put("left", "left");
		
		
		//嵌套格式
		//jsonObject:{"obj":{"second":"222","third":"333"},"ele":{"four":"444","five":"555"}}
		JSONObject jsonObj = new JSONObject();
		jsonObj.put("second", "222");
		jsonObj.put("third", "333");
		
		JSONObject ele = new JSONObject();
		ele.put("four", "444");
		ele.put("five", "555");
		
		jsonObject.element("obj", jsonObj);
		jsonObject.element("ele", ele);
		
		//数组嵌套格式
		//jsonObject:{"data":[{"name":"张三","age":"23","sex":"男"},{"name":"李三","age":"20","sex":"女"}]}
		JSONObject dataEle1 = new JSONObject();
		dataEle1.put("name", "张三");
		dataEle1.put("age", "23");  
		dataEle1.put("sex", "男");
		
		JSONObject dataEle2=new JSONObject();  
		dataEle2.put("name", "李三");  
		dataEle2.put("age", "20");  
		dataEle2.put("sex", "女");  
		
		JSONArray jsonArray = new JSONArray();
		jsonArray.add(0, dataEle1);
		jsonArray.add(1, dataEle2);
		
		jsonObject.accumulate("data", jsonArray);
		//jsonObject.element("data", jsonArray);//貌似这两种方法都可以,我没有去详细的查过,所以也不清楚它们两者之间到底有什么区别
		return jsonObject;
	}
	
}

关于微信API中的模板消息接口:

POST数据说明

POST数据示例如下:


       {
           "touser":"OPENID",
           "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
           "url":"http://weixin.qq.com/download",
           "topcolor":"#FF0000",
           "data":{
                   "first": {
                       "value":"恭喜你购买成功!",
                       "color":"#173177"
                   },
                   "keynote1":{
                       "value":"巧克力",
                       "color":"#173177"
                   },
                   "keynote2": {
                       "value":"39.8元",
                       "color":"#173177"
                   },
                   "keynote3": {
                       "value":"2014年9月16日",
                       "color":"#173177"
                   },
                   "remark":{
                       "value":"欢迎再次购买!",
                       "color":"#173177"
                   }
           }
       }

Java中进行封装,组装成上面的JSON格式数据

我的方法比较笨,仅作参考:

public class JsonTemplate {
	private String touser;//接收者
	private String template_id;//模板ID
	private String url;//URL地址
	private String topcolor;//顶部颜色
	private JSONObject data;//内容

	public JsonTemplate(){
		
	}
	
	public String getTouser() {
		return touser;
	}

	public void setTouser(String touser) {
		this.touser = touser;
	}

	public String getTemplate_id() {
		return template_id;
	}

	public void setTemplate_id(String template_id) {
		this.template_id = template_id;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getTopcolor() {
		return topcolor;
	}

	public void setTopcolor(String topcolor) {
		this.topcolor = topcolor;
	}

	public JSONObject getData() {
		return data;
	}

	public void setData(JSONObject data) {
		this.data = data;
	}
}


package com.wx.pojo.template;
/**
 * 模板消息的内容
 * @author feizi
 * @time 2015-1-27下午2:53:49
 */
public class DataElement {
	private String title;// 标题名
	private String value;// 内容
	private String color;// 颜色

	public DataElement() {

	}

	public DataElement(String title, String value, String color) {
		this.title = title;
		this.value = value;
		this.color = color;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}
}


测试上面的JSON示例:


/**
	 * 组装JSON格式
	 * @param tmp
	 * @param dataList
	 * @return
	 */
	public static JSONObject createJSONObject(JsonTemplate tmplate,List<DataElement> dataList){
		JSONObject dataJson = new JSONObject();
		if(dataList != null && dataList.size() > 0){
			JSONObject elementJson = null;
			for (DataElement data : dataList) {
				elementJson = new JSONObject();
				elementJson.put("value", data.getValue());
				elementJson.put("color", data.getColor());
				
				dataJson.put(data.getTitle(), elementJson);
			}
		}
		
		JSONObject tmpJSON = new JSONObject();
		tmpJSON.put("touser", tmplate.getTouser());
		tmpJSON.put("template_id", tmplate.getTemplate_id());
		tmpJSON.put("url", tmplate.getUrl());
		tmpJSON.put("topcolor", tmplate.getTopcolor());
		tmpJSON.put("data", dataJson);
		
		return tmpJSON;
	}
	
	public static void main(String[] args) {
		JsonTemplate tmp = new JsonTemplate();
		tmp.setTouser("OPENID");
		tmp.setTemplate_id("ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY");
		tmp.setUrl("http://weixin.qq.com/download");
		tmp.setTopcolor("#FFF");
		
		DataElement data0 = new DataElement();//由于已经重写了带参构造器,也可以直接调用带参构造器进行初始化操作
		data0.setTitle("first");
		data0.setValue("恭喜你购买成功!");
		data0.setColor("#173177");
		
		DataElement data1 = new DataElement();
		data1.setTitle("keynote1");
		data1.setValue("巧克力");
		data1.setColor("#173177");
		
		DataElement data2 = new DataElement();
		data2.setTitle("keynote2");
		data2.setValue("39.8元");
		data2.setColor("#173177");
		
		DataElement data3 = new DataElement();
		data3.setTitle("keynote3");
		data3.setValue("2014年9月16日");
		data3.setColor("#173177");
		
		DataElement data4 = new DataElement();
		data4.setTitle("remark");
		data4.setValue("欢迎再次购买!");
		data4.setColor("#173177");
		
		List<DataElement> dataList = new ArrayList<DataElement>();
		dataList.add(data0);
		dataList.add(data1);
		dataList.add(data2);
		dataList.add(data3);
		dataList.add(data4);
		
		JSONObject tmpJSON = JsonTemplate.createJSONObject(tmp, dataList);
		
		System.out.println(tmpJSON);
		
	}

运行之后,控制台的输出结果:

{"touser":"OPENID","template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY","url":"http://weixin.qq.com/download","topcolor":"#FFF","data":{"first":{"value":"恭喜你购买成功!","color":"#173177"},"keynote1":{"value":"巧克力","color":"#173177"},"keynote2":{"value":"39.8元","color":"#173177"},"keynote3":{"value":"2014年9月16日","color":"#173177"},"remark":{"value":"欢迎再次购买!","color":"#173177"}}}


猜你喜欢

转载自blog.csdn.net/hu1991die/article/details/43197725
今日推荐