您的位置:首页 > 移动开发 > Objective-C

百度天气api开发 全解析xml和json格式 使用json-lib jsonObject、 Gson 方式把json 转换成 java对象

2015-03-05 16:34 579 查看
首先你必须有一个百度的,访问应用(AK) ,否则就别往下读了

申请地址:http://lbsyun.baidu.com/apiconsole/key

注意:

写在前面-- java的类文件必须是utf-8,否则读出来的是乱码

1.功能是访问百度的天气api,配置相应的参数,得到对应的数据
http://api.map.baidu.com/telematics/v3/weather?location=116.3,39.9&ak=mhn3ZNqG82zvcFInkXL39oaz
地址location可以是经纬度,也可以是城市名称如北京

ak码是必须的,否则不能访问

还有一个参数是&output=json,不写的话解析的是xml

2.程序的主线是main中的两个:

new WeatherUtilsBaidu().getWeatherBaiduXML();//xml提取



new WeatherUtilsBaidu().getWeatherBaiduJSON();//json提取

3.数据的读取,一个是联网的,一个是自己copy下来自己读取这样是为了快速测试

4.xml的解析是常规的方式

json的读取用了两种方式,一个是Gson,一个是jsonObject;

本人推荐gson,因为遇到嵌套的多级关系时,只需建立对应的类即可,很方便

5.其他涉及:i/o读取,反射机制,嵌套循环模式

package com.tsingsoft.weather.util;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.google.gson.Gson;

import net.sf.json.*;

public class WeatherUtilsBaidu {

	public static void main(String[] args) throws Exception {
		/**
		 * 百度
		 */
		//xml提取
		new WeatherUtilsBaidu().getWeatherBaiduXML();
		//json提取
		new WeatherUtilsBaidu().getWeatherBaiduJSON();
		/**
		 * json的提取练习
		 */
//		testjson();
		
	}
	/**
	 * 百度接口
	 * @throws Exception
	 */
//	参数类型	参数名称	是否必须	具体描述
//	String	ak	true	开发者密钥
//	String	sn	false	若用户所用ak的校验方式为sn校验时该参数必须。 
//	String	location	true	输入城市名或经纬度,城市名称如:北京,经纬度格式为lng,lat坐标如: location=116.305145,39.982368;城市天气预报中间"|"分隔,location=116.305145,39.982368| 122.305145,36.982368|….
//	String	output	false	输出的数据格式,默认为xml格式,当output设置为’json’时,输出的为json格式的数据;
//	String	coord_type	false	请求参数坐标类型,默认为gcj02经纬度坐标。允许的值为bd09ll、bd09mc、gcj02、wgs84。bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托坐标,gcj02表示经过国测局加密的坐标。wgs84表示gps获取的坐标。
//	例子:http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=yourkey
	public void getWeatherBaiduXML() throws Exception {
		//http://api.map.baidu.com/telematics/v3/weather?location=116.3,39.9&ak=mhn3ZNqG82zvcFInkXL39oaz
		//location=北京
		//output=json
		//第一级:<CityWeatherResponse> 第二级:<results> 
		//第三级:<currentCity>北京市</currentCity> ; <weather_data>其中有 <date>  <wind>  <weather> <temperature>
		/**
		 * xml
		 */
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document doc =null; 
		/**
		 * url访问
		 */
//		String url_s = "http://api.map.baidu.com/telematics/v3/weather?location=116.3,39.9&ak=mhn3ZNqG82zvcFInkXL39oaz";
//		URL url = new URL(url_s);
//		URLConnection connection = url.openConnection();
//		doc = builder.parse(connection.getInputStream());
		/**
		 * 提取本地访问
		 */
		InputStream filein = new FileInputStream("E:/算法:天气预报/百度weather/baidu.xml");
		doc = builder.parse(filein);
		
		System.out.println("百度天气:");
		System.out.print("城市:");
		NodeList nodeList = doc.getElementsByTagName("currentCity"); 
		for(int i=0;i<nodeList.getLength();i++) {
			Node node = nodeList.item(i);//1个 result
			System.out.println(node.getTextContent());
		}
		System.out.print("日期:");
		nodeList = doc.getElementsByTagName("date"); 
		for(int i=0;i<nodeList.getLength();i++) {
			Node node = nodeList.item(i);//1个 result
			System.out.println(node.getTextContent());
		}
		System.out.println("风:");
		nodeList = doc.getElementsByTagName("wind"); 
		for(int i=0;i<nodeList.getLength();i++) {
			Node node = nodeList.item(i);//1个 result
			System.out.println(node.getTextContent());
		}
	}
	
	public static void testjson(){
		String json = "[{\"Id\":\"100\",\"number\":\"456\"},{\"Id\":\"100\",\"number\":\"123\"}]";
//		String json="[{"Id":"100","number":"456"},{"Id":"100","number":"123"}]";
		// 这里由于格式原因不能使用,这个只是一个对象,例子是数组的格式
		// JSONObject o = (JSONObject)JSONSerializer.toJSON(json);
		JSONArray jsonNodes = JSONArray.fromObject(json);
		for (Object obj : jsonNodes) {
			JSONObject jsonNode = JSONObject.fromObject(obj);
			System.out.println(jsonNode.getLong("Id") + ":"+ jsonNode.getString("number"));
		}
	}
	
	public void getWeatherBaiduJSON() throws Exception {
		String json="";
		StringBuffer sb= new StringBuffer();
		Reader in=null;
		/**
		 * url访问
		 */
		URL url = new URL(getSend("116.3,39.9"));
//		URL url = new URL(getSend("北京"));
		URLConnection connection = url.openConnection();
		in=new InputStreamReader(connection.getInputStream());
		/**
		 * 提取本地访问
		 */
//		in = new FileReader("E:/算法:天气预报/百度weather/baidu.json");
		//最好使用缓存读写
		BufferedReader Bufin = new BufferedReader(in);
		/**
		 * 方式一:易记忆,但只针对 BufferedReader
		 */
		String line = Bufin.readLine();
		while (line != null) {
			sb.append(line);
			line = Bufin.readLine();
		}
		/**
		 * 方式二:不好记,通用性强
		 */
//		char[] temp=new char[1024];
//		int len=0;
//		while((len=Bufin.read(temp))!=-1){ 
//			sb.append(temp,0,len);
//		}
		Bufin.close();
		/**
		 * 对于gson类方式:对象json不能[]开头,必须{}开头
		 */
//		json= "["+sb.toString()+"]" ;
		json= sb.toString();
		System.out.println(json);
		
        /**
		 * 方式一:Gson,推荐 fromJsonToJava 类
		 * 定义类,直接生成对象
		 */
		Gson gson = new Gson();
		Status status = gson.fromJson(json, Status.class);
		System.out.println(status.getResults().get(0).getCurrentCity()+":"+status.getDate());
		for(Weather wea:status.getResults().get(0).getWeather_data()){
			System.out.println(wea.getDate()+"|"+wea.getWind()+"|"+wea.getTemperature()+"|"+wea.getWeather());
		}
		/**
		 * 方式二:JSONObject
		 * 递归循环
		 */
//		System.out.println("--递归提取json信息-----------------------------------------");
//		getJsonValue(json);
		/**
		 * 方式三:JSONObject
		 * 循环封装,目前只有一层的,不能多个对象列表存储
		 */
//		System.out.println("--获取一级对象-----------------------------------------");
//		JSONObject jsonObject = JSONObject.fromObject(json);
//		Status statusJO = (Status) fromJsonToJava(jsonObject,Status.class);
//		System.out.println(statusJO.getStatus());
	}
	
	private static Object fromJsonToJava(JSONObject json,Class pojo) throws Exception{
        // 首先得到pojo所定义的字段
        Field [] fields = pojo.getDeclaredFields();
        // 根据传入的Class动态生成pojo对象
        Object obj = pojo.newInstance();
        for(Field field: fields){
            // 设置字段可访问(必须,否则报错)
            field.setAccessible(true);
            // 得到字段的属性名
            String name = field.getName();
            // 这一段的作用是如果字段在JSONObject中不存在会抛出异常,如果出异常,则跳过。
            try{
                    json.get(name);
            }catch(Exception ex){
                continue;
            }
            System.out.println(name+":"+json.get(name));
            if(json.get(name) != null && !"".equals(json.getString(name))){
                // 根据字段的类型将值转化为相应的类型,并设置到生成的对象中。
                if(field.getType().equals(Long.class) || field.getType().equals(long.class)){
                    field.set(obj, Long.parseLong(json.getString(name)));
                }else if(field.getType().equals(String.class)){
                    field.set(obj, json.getString(name));
                } else if(field.getType().equals(Double.class) || field.getType().equals(double.class)){
                    field.set(obj, Double.parseDouble(json.getString(name)));
                } else if(field.getType().equals(Integer.class) || field.getType().equals(int.class)){
                    field.set(obj, Integer.parseInt(json.getString(name)));
                } else if(field.getType().equals(java.util.Date.class)){
                    field.set(obj, Date.parse(json.getString(name)));
                }else{
                    continue;
                }
            }
        }
        return obj;
    }
	
	/*
	 * 递归遍历json所有子条目
	 */
	public static String getJsonValue(String json) {
		if(!json.contains("{") && !json.contains("[") && json.contains(":")) {
			return json;
		} else if(json.equals("")){
			return json;
		} else if(json.trim().charAt(0) == '{'){
			String value = null;
			JSONObject jsonObject = JSONObject.fromObject(json);
	        Iterator keyIter = jsonObject.keys();
	        while( keyIter.hasNext()) {
	        	String key = (String)keyIter.next();
	        	value = jsonObject.get(key).toString();
	        	getJsonValue(value);
	        	if(!value.contains("{") && !value.contains("[")) {
	        		System.out.println(key + " = " + value);
	        	}
	        	
	        }
	        return value;
		} else if(json.trim().charAt(0) == '[') {
			String value = null;
			JSONArray jsonArr = JSONArray.fromObject(json);
			for (int i = 0; i < jsonArr.size(); i++) {
				value = jsonArr.getJSONObject(i).toString();
				getJsonValue(value);
				if(!value.contains("{") && !value.contains("[")) {
	        		System.out.println("----"+value);
	        	}
			}
			
			return value;
		} else {
			return "error";
		}
	}
	
	private static String api = "http://api.map.baidu.com/telematics/v3/weather?";
	private static String output = "json";
	private static String ak = "mhn3ZNqG82zvcFInkXL39oaz";
	public static String getSend(String str){
        //将传进来的城市转码
		try {
		    str = URLEncoder.encode(str, "utf-8");
		} catch (Exception e) {
		    e.printStackTrace();
		}
		//拼接url
		StringBuffer buf = new StringBuffer();
		buf.append("location=");
		buf.append(str);
		buf.append("&output=");
		buf.append(output);
		buf.append("&ak=");
		buf.append(ak);
		String param = buf.toString();
		        //这是接收百度API 
		String urlName = api + param;
		return urlName; 
	}
}

class Status{
    private String error;
    private String status;
    private String date;
    private List<Results> results;
	public String getError() {
		return error;
	}
	public void setError(String error) {
		this.error = error;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public List<Results> getResults() {
		return results;
	}
	public void setResults(List<Results> results) {
		this.results = results;
	}
}
 
class Results{
    private String currentCity;
    private List<Weather> weather_data;
	public String getCurrentCity() {
		return currentCity;
	}
	public void setCurrentCity(String currentCity) {
		this.currentCity = currentCity;
	}
	public List<Weather> getWeather_data() {
		return weather_data;
	}
	public void setWeather_data(List<Weather> weatherData) {
		weather_data = weatherData;
	}
}
 
class Weather{
    private String date;
    private String dayPictureUrl;
    private String nightPictureUrl;
    private String weather;
    private String wind;
    private String temperature;
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getDayPictureUrl() {
		return dayPictureUrl;
	}
	public void setDayPictureUrl(String dayPictureUrl) {
		this.dayPictureUrl = dayPictureUrl;
	}
	public String getNightPictureUrl() {
		return nightPictureUrl;
	}
	public void setNightPictureUrl(String nightPictureUrl) {
		this.nightPictureUrl = nightPictureUrl;
	}
	public String getWeather() {
		return weather;
	}
	public void setWeather(String weather) {
		this.weather = weather;
	}
	public String getWind() {
		return wind;
	}
	public void setWind(String wind) {
		this.wind = wind;
	}
	public String getTemperature() {
		return temperature;
	}
	public void setTemperature(String temperature) {
		this.temperature = temperature;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: