您的位置:首页 > Web前端 > JavaScript

【第21篇】通过Gson去把字符串转成json,对象转成Json,数组转换成Json处理Json数据

2015-01-19 22:56 981 查看
package ivyy.taobao.com.domain.gson;

import ivyy.taobao.com.entity.Address;
import ivyy.taobao.com.utils.GlobalConstants;
import ivyy.taobao.com.utils.HttpRequestUtils;
import ivyy.taobao.com.utils.IoUtils;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
@SuppressWarnings("all")
/**
 *@Date:2015-1-5
 *@Author:liangjilong
 *@Email:jilongliang@sina.com
 *@Version:1.0
 *@Description:
 */
public class JsonMap {
	private static Gson gson=new Gson();
	//jsonmap.json文件
	public static void main(String[] args) throws Exception {
		//也可以从jsonmap.json通过文件流读取
		//setDataByGson();
		//getDataByGson("URL");
		getDataByGson("FILE");
		//getStrToJsonByGson();
		//getObjectToJsonByGson();
		//getArrayToJsonByGson();
		///////////////////////////////////
	}

	/**
	 * ByGson把字符串转换成Json数据
	 * @throws Exception
	 */
	private static void getStrToJsonByGson()throws Exception
	{
		//String jsonStr="{\"city\":\"广州市\",\"province\":\"广东省\"}"; //这本身是json数据,也是字符串!
		 String jsonStr="{city:广州市,province:广东省}"; 
		 Address addr =gson.fromJson(jsonStr,Address.class);//把字符串转换成Json
		 String json=gson.toJson(addr);//把对象转换成json
		 System.out.println(json);
		 System.out.println(addr.getProvince()+"\t"+addr.getCity());
	}

	/**
	 * Gson结合反射对象,把对象转换成Json数据
	 * @throws Exception
	 */
	private static void getObjectToJsonByGson()throws Exception
	{
		 Address addr = new Address(); 
		 addr.setProvince("广东省");
		 addr.setCity("广州市");
		 String json=gson.toJson(addr);//把对象转换成Json
		 //创建一个JsonParser对象
		 //JsonParser parser = new JsonParser();  
		 //创建一个JsonElement对象
         //JsonElement jsonEl = parser.parse(json);  
		 Type type = new TypeToken<Address>(){}.getType();//通过反射
		 Address add= gson.fromJson(json,type);
		 //Address add= gson.fromJson(jsonEl,type);
		 System.out.println(add.getProvince()+"\t"+add.getCity());
	}
	
	
	
	
	
	/**
	 * 通过Gson把数组转换成Json数据
	 * @param url
	 * @throws Exception
	 */
	private static void getArrayToJsonByGson()throws Exception
	{
		List<Address> lists=new ArrayList<Address>();
		for (int i = 1; i <=12; i++) {
			Address addr = new Address(); 
			addr.setProvince("第"+i+"个省份");
			addr.setCity("第"+i+"个城市");
			lists.add(addr);
		}
		String json=gson.toJson(lists);//把数组对象转换成Json
		Type type = new TypeToken<List<Address>>(){}.getType();//通过反射
		List<Address> adds= gson.fromJson(json,type);
		for (Address a:adds) {
			System.out.println(a.getCity());
		}
	}
	/**
	 * 通过Gson组装Json数据
	 */
	private  static void setDataByGson(){
		///////////////////组装json////////////////////
		 JsonObject jsonObject=new JsonObject();
		 Map<String, String> lists = new HashMap <String, String>(); 
		 
		 lists.put("country", "中国");
		 lists.put("province", "广东省");
		 lists.put("city", "云浮市");
		 lists.put("district", "云城区闻莺路东升布艺");
		 lists.put("street", "闻莺路");
			
         String json=gson.toJson(lists);//转换成json数据
         System.out.println(json); //输出json
         
         ///////////////////获取json////////////////////
         JsonParser parser = new JsonParser();
		 JsonElement jsonEl = parser.parse(json);
         JsonObject jsonObjRoot = null;
         jsonObjRoot = jsonEl.getAsJsonObject();
         if(jsonObjRoot.isJsonObject()&&jsonObjRoot.get("district")!=null &&jsonObjRoot.get("street").getAsString()!=""){
        	 String district=jsonObjRoot.get("district").getAsString();
        	 System.out.println(district);
         }
	} 
	
	/**
	 * 用gson去解析数据
	 * @param url网止连接
	 * @throws Exception
	 */
	private static void getDataByGson(String flg) throws Exception {
		//PostMethod method = new PostMethod(url);
		String responseData="";
		if(flg.equals("URL")){
			//北京市的经纬度39.983424,116.322987
			String url=GlobalConstants.getBaiduMapUrl("你的key", "39.983424,116.322987", "json");
			responseData = HttpRequestUtils.HttpURLConnRequest(url, "GET");
		}else if(flg.equals("FILE")){
			String jsonData="ivyy/taobao/com/domain/gson/jsonmap.json";
			String path = JsonMap.class.getClassLoader().getResource(jsonData).getPath();
			responseData=IoUtils.reader(path);
		}
		
		//处理页面的json数据
		int start = responseData.indexOf("(") + 1;
		responseData = responseData.substring(start, responseData.lastIndexOf(")"));
		
		// 创建一个JsonParser
		JsonParser parser = new JsonParser();
		JsonElement jsonEl = parser.parse(responseData);
		// 把JsonElement对象转换成JsonObject
		JsonObject jsonObjRoot = null;
		if (jsonEl.isJsonObject()) {
			 jsonObjRoot = jsonEl.getAsJsonObject();
			 String status="",result="",lat="",lng="",formatted_address="",business="",city="",district="",province="",street="",street_number="",cityCode="";
			 //String status=gson.toJson(jsonObjRoot.get("status"));//方法一
			 status=jsonObjRoot.get("status").getAsString();//方法二
			 JsonElement resultEl=jsonObjRoot.get("result");//result节点
			 
			 JsonElement locationEl=resultEl.getAsJsonObject().get("location");//location节点
			 
			 lat=locationEl.getAsJsonObject().get("lat").getAsString();
			 lng=locationEl.getAsJsonObject().get("lng").getAsString();
			 	
			 
		     formatted_address=resultEl.getAsJsonObject().get("formatted_address").getAsString();//formatted_address节点
		     business=resultEl.getAsJsonObject().get("business").getAsString();//business节点
			 cityCode=resultEl.getAsJsonObject().get("cityCode").getAsString();//cityCode节点

			 JsonElement compEl=resultEl.getAsJsonObject().get("addressComponent");//addressComponent节点
			 
			 city=compEl.getAsJsonObject().get("city").getAsString();
			 district=compEl.getAsJsonObject().get("district").getAsString();
			 province=compEl.getAsJsonObject().get("province").getAsString();
			 street=compEl.getAsJsonObject().get("street").getAsString();
			 street_number=compEl.getAsJsonObject().get("street_number").getAsString();
			 
			 JsonElement poisEl=resultEl.getAsJsonObject().get("pois");//pois节点
			 boolean flag=poisEl.isJsonArray();//是否为Json数组
			 if(flag){
				// System.out.println(poisEl.getAsJsonArray());
				 JsonArray jsonArray= poisEl.getAsJsonArray();//转为数组
				 String addr="",cp="",distance="",name="",poiType="",tel="",uid="",zip="",x="",y="";
				 //方法一
				 /*for(Iterator iter=jsonArray.iterator();iter.hasNext();){
					 JsonObject jop=(JsonObject) iter.next();
					 addr=jop.get("addr").getAsString();
					 x=jop.get("point").getAsJsonObject().get("x").getAsString();//x节点
					 System.out.println(jop.get("point").getAsJsonObject());
					 System.out.println("address"+addr+"\t\tx="+x);
				 }
				 */
				 //方法二
				 for (int i = 0; i < jsonArray.size(); i++) {
					 JsonObject jop=(JsonObject)jsonArray.get(i);
					 addr=jop.get("addr").getAsString();
					 cp=jop.get("cp").getAsString();
					 distance=jop.get("distance").getAsString();
					 name=jop.get("name").getAsString();
					 poiType=jop.get("poiType").getAsString();
					 tel=jop.get("tel").getAsString();
					 uid=jop.get("uid").getAsString();
					 zip=jop.get("zip").getAsString();
					
					 if(jop.get("point").getAsJsonObject().isJsonObject())
					 {
						// System.out.println(jop.get("point").getAsJsonObject());
						 x=jop.get("point").getAsJsonObject().get("x").getAsString();//x节点
						 y=jop.get("point").getAsJsonObject().get("y").getAsString();//y节点
						 System.out.println(x);
					 }
				 }
			 }
		}
	}
	
}


package ivyy.taobao.com.entity;

import java.io.Serializable;

import com.google.gson.annotations.Expose;
/**
 * Gson gson=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
 * 创建Gson对象,没有@Expose注释的属性将不会被序列化
 * serialize序列化 默认 true
 * deserialize反序列化 默认 true
 * @author liangjilong
 * @Email:jilongliang@sina.com
 */
public class Address implements Serializable{
	@Expose(serialize=false)// 序列化  /Address类已经序列化
	private int id;
	@Expose(deserialize=false)// 反序列化
	private String country;//国家
	private String province;//省份
	private String city;//城市
	private String street;//街道
	private String district;//地区
	private String cityCode;//邮政编码
	private String streetNumber;//街道号
	private String weibo;//微博
	public Address() {
	}
	
	public Address(String country, String province, int id, String cityCode,String streetNumber) {
		System.out.println(country+"\t"+province+"\t"+id+cityCode+"\t"+streetNumber);
	}
	public Address(int id,String country) {
		this.id=id;
		this.country=country;
	}
	

	public String getCityCode() {
		return cityCode;
	}
	public void setCityCode(String cityCode) {
		this.cityCode = cityCode;
	}
	public String getStreetNumber() {
		return streetNumber;
	}
	public void setStreetNumber(String streetNumber) {
		this.streetNumber = streetNumber;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getDistrict() {
		return district;
	}
	public void setDistrict(String district) {
		this.district = district;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}

	public String getWeibo() {
		return weibo;
	}

	public void setWeibo(String weibo) {
		this.weibo = weibo;
	}
	
}


package ivyy.taobao.com.utils;

import java.net.URL;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

/**
 *@Author:liangjilong
 *@Date:2015-1-4
 *@Email:jilongliang@sina.com
 *@Version:1.0
 *@Description
 */
public class GlobalConstants {
	
	/***
	 * 获取url连接
	 * @param page第几页
	 * @param format格式(XML、JSON)
	 * @return
	 */
	public static String getSinaNewUrl(Integer page,String format){
		StringBuffer buffer=new StringBuffer("http://api.roll.news.sina.com.cn/zt_list?channel=news");
		String url="";
		buffer.append("&cat_1=shxw");//显示新闻
		buffer.append("&cat_2==zqsk||=qwys||=shwx||=fz-shyf");
		buffer.append("&level==1||=2");//级别
		buffer.append("&show_ext=1");
		buffer.append("&show_all=1");//显示所有
		buffer.append("&show_num=22");//显示多少条
		buffer.append("&tag=1");
		buffer.append("&format="+format);
		buffer.append("&page="+page);
		buffer.append("&callback=newsloader");
		url=buffer.toString();
		return url;
	}
	
	/***
	 * 获取百度地图的url
	 * @param ak秘钥即你在百度申请的key调用访问地图的key
	 * @param location地方的经纬度
	 * @param format格式(json或者xml)
	 * @return
	 */
	public static String getBaiduMapUrl(String ak,String location,String format){
		StringBuffer buffer=new StringBuffer("http://api.map.baidu.com/geocoder/v2/?");
		String url="";
		buffer.append("ak="+ak);
		buffer.append("&callback=renderReverse");
		buffer.append("&location="+location);
		buffer.append("&output="+format);
		buffer.append("&pois=1");
		url=buffer.toString();
		
		return url;
	}
	
	/***
	 * 获取文章的内容
	 * 从新浪的网页分析,通过文章body的id就可以拿到相应的文章内容..
	 * @param url
	 * @return
	 */
	public static String getNewsContent(String url) throws Exception{
		Document doc=Jsoup.parse(new URL(url), 3000);
		if(doc!=null){
			String artibody=doc.getElementById("artibody").html();//通过网页的html的id去拿到新闻内容artibody
			return artibody;
		}else{
			return "网络异常";
		}
	}
}


package ivyy.taobao.com.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 *@Author:liangjilong
 *@Date:2015-1-4
 *@Email:jilongliang@sina.com
 *@Version:1.0
 *@Description
 */

public class HttpRequestUtils {
	/**
	 * 发送http请求
	 * POST和GET请求都可以
	 * @param requestUrl 请求地址
	 * @param method传入的执行的方式 是GET还是POST方式
	 * @return String
	 */
	public static String HttpURLConnRequest(String requestUrl,String method) {
		StringBuffer buffer = new StringBuffer();
		try {
			URL url = new URL(requestUrl);
			HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
			httpUrlConn.setDoInput(true);
			httpUrlConn.setRequestMethod(method);
			httpUrlConn.setUseCaches(false);  
			httpUrlConn.setInstanceFollowRedirects(true); //重定向
			httpUrlConn.connect();
			// 将返回的输入流转换成字符串
			InputStream inputStream = httpUrlConn.getInputStream();
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

			String str = null;
			while ((str = bufferedReader.readLine()) != null) {
				buffer.append(str);
			}
			bufferedReader.close();
			inputStreamReader.close();
			// 释放资源
			inputStream.close();
			inputStream = null;
			httpUrlConn.disconnect();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return buffer.toString();
	}
}
package ivyy.taobao.com.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.Writer;

/**
 *@Author:liangjilong
 *@Date:2015-1-5
 *@Version:1.0
 *@Description:
 */
public class IoUtils {

	/**
	 * 读文件流
	 * 
	 * @param filePath从哪里读取的文件路径
	 * @return
	 */
	public static String reader(String filePath) {
		String content="";
		FileReader read = null;
		BufferedReader reader = null;
		try {
			read = new FileReader(new File(filePath));
			reader = new BufferedReader(read);
			StringBuffer buffer = new StringBuffer("");
			content = reader.readLine();
			while (content != null) {
				buffer.append(content).append("\n");
				content = reader.readLine();
			}
			return content = buffer.toString();// 返回
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (reader != null)
					reader.close();
				if (read != null)
					read.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return "";// 没值就返回空
	}
	
	/**
	 * 处理文件写
	 * @param content
	 * @param htmlPath
	 * @return
	 */
	public static boolean write(String content, String htmlPath) {  
        boolean flag = true;  
        try {  
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlPath), "utf-8"));  
            out.write("\n" + content);  
            out.close();  
        } catch (Exception ex) {  
            ex.printStackTrace();  
            return false;  
        }  
        return flag;  
    } 
}
renderReverse&&renderReverse(
	{
    "status": 0,
    "result": {
        "location": {
            "lng": 116.32298703399,
            "lat": 39.983424051248
        },
        "formatted_address": "北京市海淀区中关村大街27号1101-08室",
        "business": "中关村,人民大学,苏州街",
        "addressComponent": {
            "city": "北京市",
            "direction": "附近",
            "distance": "7",
            "district": "海淀区",
            "province": "北京市",
            "street": "中关村大街",
            "street_number": "27号1101-08室"
        },
        "pois": [
            {
                "addr": "北京市海淀区海淀路35号",
                "cp": "NavInfo",
                "direction": "附近",
                "distance": "25",
                "name": "中关村大厦",
                "poiType": "商务大厦",
                "point": {
                    "x": 116.32285606105,
                    "y": 39.983568897877
                },
                "tel": "",
                "uid": "3c08da2d19c0964d9b005001",
                "zip": ""
            },
            {
                "addr": "北京市海淀区中关村大街27号1101-08室",
                "cp": "NavInfo",
                "direction": "附近",
                "distance": "1",
                "name": "眉州东坡酒楼中关村店",
                "poiType": "餐饮",
                "point": {
                    "x": 116.32298182382,
                    "y": 39.983416864194
                },
                "tel": "",
                "uid": "95540906d327cb7527d2bb0a",
                "zip": ""
            },
            {
                "addr": "北京市海淀区中关村大街27号1101-08室",
                "cp": "NavInfo",
                "direction": "附近",
                "distance": "1",
                "name": "中国人民财产保险中关村营业部",
                "poiType": "金融",
                "point": {
                    "x": 116.32298182382,
                    "y": 39.983416864194
                },
                "tel": "",
                "uid": "04b48c6cd2a493b92a06ce64",
                "zip": ""
            },
            {
                "addr": "北京市海淀区海淀路35号",
                "cp": "NavInfo",
                "direction": "附近",
                "distance": "41",
                "name": "中国建设银行中关村支行",
                "poiType": "金融",
                "point": {
                    "x": 116.32291894244,
                    "y": 39.98370711002
                },
                "tel": "",
                "uid": "4eabebb07d31784b4d6d461f",
                "zip": ""
            },
            {
                "addr": "北京市海淀区知春路113号1706号",
                "cp": "NavInfo",
                "direction": "西",
                "distance": "498",
                "name": "银网中心",
                "poiType": "商务大厦",
                "point": {
                    "x": 116.32720385972,
                    "y": 39.982269689954
                },
                "tel": "",
                "uid": "fd8f491140a0a7beadee7a37",
                "zip": ""
            },
            {
                "addr": "北京市海淀区中关村大街27号",
                "cp": "NavInfo",
                "direction": "附近",
                "distance": "28",
                "name": "中国建设银行ATM",
                "poiType": "金融",
                "point": {
                    "x": 116.3229458916,
                    "y": 39.983617272159
                },
                "tel": "",
                "uid": "2c7d2dbe35f607d3cafa5fbe",
                "zip": ""
            },
            {
                "addr": "北京市海淀区中关村大街25号",
                "cp": "NavInfo",
                "direction": "附近",
                "distance": "43",
                "name": "中关村大厦停车场",
                "poiType": "交通设施",
                "point": {
                    "x": 116.32334114602,
                    "y": 39.983292472745
                },
                "tel": "",
                "uid": "d74b272e19c0964d9b0050ff",
                "zip": ""
            },
            {
                "addr": "北京市海淀区中关村大街23号",
                "cp": "NavInfo",
                "direction": "西",
                "distance": "115",
                "name": "中国科学院黄庄小区",
                "poiType": "地产小区",
                "point": {
                    "x": 116.32396995988,
                    "y": 39.983672557011
                },
                "tel": "",
                "uid": "3594ec2c0c19ca50a3d23036",
                "zip": ""
            },
            {
                "addr": "北京市海淀区丹棱街甲1",
                "cp": "NavInfo",
                "direction": "东南",
                "distance": "296",
                "name": "欧美汇购物中心",
                "poiType": "购物",
                "point": {
                    "x": 116.32159843334,
                    "y": 39.985172141413
                },
                "tel": "",
                "uid": "7cbcc1af640ac86e744ff1b7",
                "zip": ""
            },
            {
                "addr": "北京市海淀区中关村大街19号-3层-l310号",
                "cp": "NavInfo",
                "direction": "东南",
                "distance": "185",
                "name": "新中关大厦",
                "poiType": "商务大厦",
                "point": {
                    "x": 116.32194877248,
                    "y": 39.984425808622
                },
                "tel": "",
                "uid": "001cbcab42491f56d92f281e",
                "zip": ""
            }
        ],
        "poiRegions": [],
        "cityCode": 131
    }
}
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐