Gson解析第三方提供Json数据(天气预报,新闻等)
之前都是自己写后台,自己的server提供数据给client。
近期在看第三方的数据接口,訪问其它站点提供的信息。比方。我们可能自己收集的数据相当有限。可是网上提供了非常多关于天气预报、新闻、星座运势、身份证号、车辆违章、健康医疗、快递查询、ip查询、翻译等的api接口。基本返回数据为类型json和xml
我就喜欢简单便捷的东西。在这解析一下第三方新闻的接口返回的json数据;
我喜欢用谷歌提供的Gson,感觉比JSON去解析要简单。方便,快捷;当然了阿里巴巴提供的fastjson也是极好的。在这仅仅用gson解析了(废话似乎多了点)。
①先看一下我要解析的第三方的数据:(图片看不清能够拖动图片到新的页面标签中看哦~)
②然后从上面能够得到json数据的key值。
③由于Gson是基于对象的,所以我们要将这些 “键值”建立一个实体类
首先能够看到最外层是三个键值 error_code ,reason,result 然后result中为一个json数组,那么我们将json数组中的数据单独抽出一个对象来。
演示样例代码例如以下:
package com.zml.pojo; import java.util.List; /** * @author 郑明亮 * @Time:2016-3-18 上午10:28:55 * @version 1.0 */ public class NewsJson { String error_code; String reason; List<News> result; public NewsJson(String error_code, String reason, List<News> result) { super(); this.error_code = error_code; this.reason = reason; this.result = result; } public NewsJson() { super(); // TODO Auto-generated constructor stub } public String getError_code() { return error_code; } public void setError_code(String error_code) { this.error_code = error_code; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } public List<News> getResult() { return result; } public void setResult(List<News> result) { this.result = result; } @Override public String toString() { return "NewsJson [error_code=" + error_code + ", reason=" + reason + ", result=" + result + "]"; } }
package com.zml.pojo; /** * @author 郑明亮 * @Time:2016-3-18 上午10:27:13 * @version 1.0 */ public class News { String ctime; String title; String picUrl; String url; public News(String ctime, String tittle, String picUtl, String url) { super(); this.ctime = ctime; this.title = tittle; this.picUrl = picUtl; this.url = url; } public News() { super(); // TODO Auto-generated constructor stub } public String getCtime() { return ctime; } public void setCtime(String ctime) { this.ctime = ctime; } public String getTittle() { return title; } public void setTittle(String tittle) { this.title = tittle; } public String getPicUtl() { return picUrl; } public void setPicUtl(String picUtl) { this.picUrl = picUtl; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @Override public String toString() { return "News [ctime=" + ctime + ", tittle=" + title + ", picUtl=" + picUrl + ", url=" + url + "]"; } }
④然后就是进行解析了,解析方法我在之前的博文中已经介绍了。假设没看的能够,先看看;
在这直接将方法列出来了:
public static <T> T getObjectData(String jsonString, Class<T> type) { T t = null; try { Gson gson = new Gson(); t = gson.fromJson(jsonString, type); } catch (JsonSyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return t; }
/** * 将输入流转换为byte[] * * @param is * @return */ public static byte[] IsToByte(InputStream is) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte buffer[] = new byte[1024]; int len = 0; try { while ((len = is.read(buffer)) != -1) { bos.write(buffer, 0, len); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } finally { try { bos.flush(); bos.close(); is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return bos.toByteArray(); }
⑤測试解析方法:
package com.zml.pojo.test; import static org.junit.Assert.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import org.junit.Test; import com.zml.pojo.NewsJson; import com.zml.utils.GsonTools; /** * @author 郑明亮 * @Time:2016年3月18日 上午10:35:39 * @version 1.0 */ public class TestGsonAPI { @Test public void test() { try { URL url = new URL("http://api.avatardata.cn/TechNews/Query?key=5e3bedcfa2714e36a3e46dd2efce00d9&page=1&rows=10"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // String data = connection.getContentType(); String dataString = new String(GsonTools.IsToByte(connection.getInputStream()),"utf-8"); NewsJson newsJson = GsonTools.getObjectData(dataString, NewsJson.class); System.out.println(newsJson.toString()); System.out.println(dataString); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
数据太多了,仅仅截图了一部分数据:(图片看不清能够拖动图片到新的页面标签中看哦~)