使用Java和Google GSON解析ESPN API

在我的第一篇文章中,我将解释如何解析ESPN API。 可以在http://developer.espn.com/docs上找到API文档。

首先,您需要请求一个API密钥,然后可以开始查询REST API以检索JSON响应。 在下面的示例中,我将简单地查询在英格兰英超联赛中踢球的“足球”运动。

通过阅读文档,这是我需要向其发送请求的URL(用[apiKey]替换为正确的值)。

http://api.espn.com/v1/sports/soccer/eng.1/athletes?apikey=[apiKey]

首先要记住的是,如果您想要的结果不止50个,则有一个offset值会迫使您进行多个查询,这是通过称为offset的参数进行设置的。 因此,例如,要从51-101获得结果,以下查询将这些结果拉回去。 我们稍后会再讨论,因为这可能会引起一些轻微的问题。

http://api.espn.com/v1/sports/soccer/eng.1/athletes?apikey=[apiKey]&offset=51

现在我已经有了完整的描述,我将开始代码,应该注意的是我正在使用GSON来解析JSON,因此您需要添加以下Maven依赖项。

<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.2.2</version>
</dependency>

完成此操作后,您运行了maven:install以下载jar,可以开始查询。 从ESPN API下载JSON只需下面的代码

private static String readUrl(final String urlString) throws Exception {BufferedReader reader = null;try {final URL url = new URL(urlString);reader = new BufferedReader(new InputStreamReader(url.openStream()));final StringBuffer buffer = new StringBuffer();int read;final char[] chars = new char[1024];while ((read = reader.read(chars)) != -1) {buffer.append(chars, 0, read);}return buffer.toString();} finally {if (reader != null) {reader.close();}}}

现在我们可以开始解析此JSON,因为生成的JSON具有很多冗余数据,所以我决定不将其解析为对象,而只是对其进行原始查询。

private static JsonArray getAthletesJsonArray(final int offset)throws Exception {final String json = readUrl(getUrl(offset));final JsonArray sports = getSportsJsonArray(json);final JsonElement league = sports.get(0);return league.getAsJsonObject().get("leagues").getAsJsonArray().get(0).getAsJsonObject().get("athletes").getAsJsonArray();}private static JsonArray getSportsJsonArray(final String json) {final JsonArray sports = new JsonParser().parse(json).getAsJsonObject().get("sports").getAsJsonArray();return sports;}private static String getUrl(final int offset) {return APIURL + APIKEY + "&offset=" + offset;}

这将为我们提供一个JsonArray的运动员以及可以从中获取的相关数据。 值得注意的是,此处的响应因您的API配额(免费,合作伙伴,付费等)而异。 我将在此处http://developer.espn.com/docs/athletes#parameters离开相关的ESPN API页面。

现在,当我们有了所需的相关JsonArray时,我们可以循环遍历它以返回有关每个播放器的数据。

for (int offset = 1; offset < 650; offset = offset + 50) {try {final JsonArray athletes = getAthletesJsonArray(offset);for (final JsonElement athlete : athletes) {System.out.println(athlete.getAsJsonObject().get("fullName"));}Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}}

应当指出,此代码看起来有些奇怪。 首先,睡眠的原因是因为API限制了您每秒可以调用它的次数,目前,由于我免费编写此代码,因此每3秒只能使用一次。 其次,它处于650循环的原因是与我在本文前面引用的偏移量有关。 这意味着您需要查询每50个播放器,这在计算上似乎有点昂贵,因为我认为仅返回602个播放器而不是承担接收12个RESTful调用的繁重工作就容易了。

然后,当我们将所有这些放在一起时,您将获得下面的课程,这将遍历每个给您名字的玩家。

package org.espn.app;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;/*** @author David Gray * * This class is simply an example of how to parse the Json*         API for ESPN.*/
public class EspnParser {private static final String APIKEY = "apiKey";private static final String APIURL = "http://api.espn.com/v1/sports/soccer/eng.1/athletes?apikey=";/*** @param arguments*            for main method.*/public static void main(final String[] args) {for (int offset = 1; offset < 650; offset = offset + 50) {try {final JsonArray athletes = getAthletesJsonArray(offset);for (final JsonElement athlete : athletes) {System.out.println(athlete.getAsJsonObject().get("fullName"));}Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}}}private static JsonArray getAthletesJsonArray(final int offset)throws Exception {final String json = readUrl(getUrl(offset));final JsonArray sports = getSportsJsonArray(json);final JsonElement league = sports.get(0);return league.getAsJsonObject().get("leagues").getAsJsonArray().get(0).getAsJsonObject().get("athletes").getAsJsonArray();}private static JsonArray getSportsJsonArray(final String json) {final JsonArray sports = new JsonParser().parse(json).getAsJsonObject().get("sports").getAsJsonArray();return sports;}private static String getUrl(final int offset) {return APIURL + APIKEY + "&offset=" + offset;}private static String readUrl(final String urlString) throws Exception {BufferedReader reader = null;try {final URL url = new URL(urlString);reader = new BufferedReader(new InputStreamReader(url.openStream()));final StringBuffer buffer = new StringBuffer();int read;final char[] chars = new char[1024];while ((read = reader.read(chars)) != -1) {buffer.append(chars, 0, read);}return buffer.toString();} finally {if (reader != null) {reader.close();}}}}

您可以在github https://github.com/david99world/EspnApiParsingExample上下载完整项目

参考:来自Code Mumble博客的JCG合作伙伴 David Gray 使用Java和Google GSON解析ESPN API 。

翻译自: https://www.javacodegeeks.com/2013/06/parsing-espn-api-using-java-and-google-gson.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java string对象创建对象_Java String 创建了几个对象

我们首先来看一段代码&#xff1a;Java代码String strnew String("abc");紧接着这段代码之后的往往是这个问题&#xff0c;那就是这行代码究竟创建了几个String对象呢&#xff1f;相信大家对这道题并不陌生&#xff0c;答案也是众所周知的&#xff0c;2个。接下来我们…

js 图片不保存的回显功能/图片尺寸验证/图片大小验证 /图片类型验证

大部分转自&#xff1a;http://blog.csdn.net/qq_39200924/article/details/79198766 在项目中经常用到input标签来上传文件&#xff0c;而这些文件通常是图片文件。图片有很多格式我们只需要其中的几种&#xff0c;就需要对用户上传的文件进行验证&#xff0c;在HTML5中有一个…

sqlx使用说明

sqlx使用指南 参考链接: http://jmoiron.github.io/sqlx/ sqlx是一个go语言包&#xff0c;在内置database/sql包之上增加了很多扩展&#xff0c;简化数据库操作代码的书写 资源 如果对go语言的sql用法不熟悉&#xff0c;可以到下面网站学习:http://go-database-sql.org/ 如果对…

填充一个池需要多少个线程?

近几个月来&#xff0c;我们一直看到一小部分但持续的操作失败&#xff0c;并带有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接&#xff1b; 嵌套异常是java.sql.SQLException&#xff1a;客户端尝试检出Connection的尝试…

@font-face 用字体画图标

HTML 1 <body>2 <!-- ul.layout>li*5>a[href#]>i.icon -->3 <!-- Sublime Text 快捷拼写 -->4 <ul class"layout">5 <li><a href"#"><i class"icon">&#xe601;</…

java mapfile_基于文件的数据结构:关于MapFile

MapFile是已经排过序的SequenceFile&#xff0c;它有索引&#xff0c;所以可以按键查找1.MapFile的写操作MapFile的写操作类似于SequenceFile的写操作。新建一个MapFile.Writer实例&#xff0c;然后调用append()方法顺序写入文件内容。如果不按顺序写入&#xff0c;就抛出一个I…

linux scp 命令

scp 命令 scp 命令 意思是 secure copy 即安全拷贝&#xff0c;可以把它看做是 cp 命令的高级版&#xff0c;可以跨主机拷贝。 经常用来在局域网内不同主机之间分享文件&#xff0c;或者在本机与远程主机中分享文件。 在使用的时候就像使用cp 命令一样&#xff0c;第一个参数是…

工厂设计模式–一种有效的方法

如您所知&#xff0c;工厂方法模式或俗称工厂设计模式是“创意设计模式”类别下的一种设计模式。 模式背后的基本原理是&#xff0c;在运行时&#xff0c;我们根据传递的参数获得类似类型的对象。 关于这种模式有很多文章&#xff0c;开发人员可以通过各种方式来实现它。 在本文…

java 循环依赖_解决Java循环依赖的问题

最近看到一个问题&#xff1a;如果有两个类A和B&#xff0c;A类中有一个B的对象b&#xff0c;B类中有一个A的对象a&#xff0c;那么如何解决这两个类的相互依赖关系呢&#xff0c;几天就给大家说一下Java的循环依赖&#xff0c;raksmart服务器。举个栗子1&#xff1a;可以看到A…

CSS块元素水平垂直居中的实现技巧

针对之前遇到过的一些特殊样式的实现&#xff0c;我今天做个总结&#xff0c;目的有二&#xff1a;一是将这些方法记录下来&#xff0c;以便将来需要用到时查找使用。二为将这些大神们智慧的结晶发扬光大&#xff0c;让广大前端程序猿们能够少走弯路。此贴为更新帖&#xff0c;…

Intellij IDEA 将工程转换成maven工程 详解

1> 右键工程&#xff0c;点击 Add Framework Support2> 选中 Maven&#xff0c;再点击 OK3> 工程根目录自动生成 pom.xml 文件&#xff0c;这样 工程就支持 Maven版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 http://blog.csdn.net/che…

设置Apache Hadoop多节点集群

我们正在分享有关在基于Linux的机器&#xff08;多节点&#xff09;上安装Apache Hadoop的经验。 在这里&#xff0c;我们还将分享我们在各种故障排除方面的经验&#xff0c;并在将来进行更新。 用户创建和其他配置步骤– 我们首先在每个集群中添加一个专用的Hadoop系统用户。…

数据结构(七)排序---直接插入排序(稳定)

经典排序算法----直接插入排序算法及其改进&#xff08;稳定&#xff09; 定义&#xff1a; 直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的&#xff0c;记录数加一的有序表。 实现思想 我们预留了一个哨兵&#xff0c;这里我们将…

CSS3中的透明属性opacity的用法实例

实例设置 div 元素的不透明级别&#xff1a;div{opacity:0.5;}完整例子&#xff1a;<!DOCTYPE html><html><head><style> div{background-color:red;opacity:0.5;filter:Alpha(opacity50); /* IE8 以及更早的浏览器 */}</style></head><…

java嵌套类型 无法隐藏外层类型_java内部类深入详解 内部类的分类 特点 定义方式 使用...

java内部类 内部类的分类 特点 定义方式 使用 外部类调用内部类 多层嵌套内部类 内部类访问外部类属性 接口中的内部类 内部类的继承 内部类的覆盖 局部内部类 成员内部类 静态内部类 匿名内部类内部类定义将一个类定义放到另一个类的内部,这就是内部类内部类与组合是完…

java.io.FileNotFoundException: generatorConfig.xml (系统找不到指定的文件。)

在使用MyBatis的逆向工程生成代码时&#xff0c;一直报错java.io.FileNotFoundException: generatorConfig.xml (系统找不到指定的文件。)&#xff0c;如图 文件结构如下&#xff1a; 代码如下&#xff1a; import java.io.File; import java.util.ArrayList; import java.util…

单例设计模式–鸟瞰

几天前&#xff0c;当我回到家乡时&#xff0c;我的一位来自同事的大三学生参加了一家跨国公司的采访&#xff0c;在采访过程中受了重伤。 我的意思是&#xff0c;由于面试小组提出的难题&#xff0c;他无法使面试合格。 当我回到班加罗尔时&#xff0c;他分享了他在技术面试中…

软件实践第一步——自我介绍

031602631&#xff1b;我是超爱美食的苏韫月&#xff1b;我的爱好是品尝所能接触到的所有甜点&#xff08;迟早&#xff01;&#xff09;&#xff1b;我最近新宠&#xff1a;拌面加扁肉&#xff08;京园淳百味&#xff09;&#xff1b;时隔一年我又回归心惊胆颤写博客文的日子。…

CSS3中使用translate() 方法实现元素位置的移动

translate() 方法通过 translate() 方法&#xff0c;元素从其当前位置移动&#xff0c;根据给定的 left&#xff08;x 坐标&#xff09; 和 top&#xff08;y 坐标&#xff09; 位置参数&#xff1a;实例div{transform: translate(50px,100px);-ms-transform: translate(50px,1…

java机器学习库_Amazon Deep Java Library——Java 机器学习工具箱

近年来&#xff0c;人们对机器学习的兴趣稳步增长。具体来说&#xff0c;现在&#xff0c;企业在各种各样的场景中使用机器学习进行图像识别。它在汽车工业、医疗保健、安全、零售、仓库、农场和农业的自动化产品跟踪、食品识别&#xff0c;甚至通过手机摄像头进行实时翻译等方…