使用GSON在Java中有组织地输出JSON响应
今天,我决定尝试为自己创建一个应用程序,使用Java显示当前2015-2016赛季的过去和现在的足球比赛 我目前似乎不知道如何正确显示JSON。web API端点是:(在没有API令牌的情况下,每天有50个请求限制)。我试图使用GSON解析JSON,但文档似乎超出了我的理解范围 以下是我目前掌握的代码: FCBFixtures.java使用GSON在Java中有组织地输出JSON响应,java,json,api,curl,gson,Java,Json,Api,Curl,Gson,今天,我决定尝试为自己创建一个应用程序,使用Java显示当前2015-2016赛季的过去和现在的足球比赛 我目前似乎不知道如何正确显示JSON。web API端点是:(在没有API令牌的情况下,每天有50个请求限制)。我试图使用GSON解析JSON,但文档似乎超出了我的理解范围 以下是我目前掌握的代码: FCBFixtures.java import java.io.*; 导入java.net。*; 导入com.google.gson.*; 公共类FCB混合{ 私有静态字符串getJSON(字符
import java.io.*;
导入java.net。*;
导入com.google.gson.*;
公共类FCB混合{
私有静态字符串getJSON(字符串url,int超时){
HttpURLConnection=null;
试一试{
URL u=新的URL(URL);
c=(HttpURLConnection)u.openConnection();
c、 setRequestMethod(“GET”);
c、 setRequestProperty(“内容长度”、“0”);
c、 setRequestProperty(“X-Auth-Token”、“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”);
c、 setUseCaches(假);
c、 setAllowUserInteraction(假);
c、 设置连接超时(超时);
c、 setReadTimeout(超时);
c、 connect();
int status=c.getResponseCode();
开关(状态){
案例200:
案例201:
BufferedReader br=新的BufferedReader(新的InputStreamReader(c.getInputStream());
StringBuilder sb=新的StringBuilder();
弦线;
而((line=br.readLine())!=null){
sb.追加(第+行“\n”);
}
br.close();
使某人返回字符串();
}
}捕获(IOEX异常){
System.out.println(例如getMessage());
系统出口(1);
}最后{
如果(c!=null){
试一试{
c、 断开连接();
}捕获(例外情况除外){
System.out.println(例如getMessage());
系统出口(1);
}
}
}
返回null;
}
公共静态void main(字符串[]args){
字符串json=getJSON(“http://api.football-data.org/v1/teams/81/fixtures", 500);
Data Data=new Gson().fromJson(json,Data.class);
系统输出打印项次(数据);
}
}
Data.java
import java.util.List;
公共类数据{
私有字符串日期;
私有字符串状态;
私人整数比赛日;
私有字符串homeTeamName;
私有字符串awayTeamName;
私人整数目标家庭队;
私有整数goalsAwayTeam;
私人清单固定装置;
公共字符串getDate(){return date;}
公共字符串getStatus(){return status;}
公共整数getMatchday(){return matchday;}
公共字符串getHomeTeamName(){返回homeTeamName;}
公共字符串getAwayTeamName(){return awayTeamName;}
公共整数getGoalsHomeTeam(){return goalsHomeTeam;}
公共整数getGoalsAwayTeam(){return goalsAwayTeam;}
public List getFixtures(){return fixtures;}
public void setDate(字符串日期){this.date=date;}
public void setStatus(字符串状态){this.status=status;}
public void setMatchday(整数matchday){this.matchday=matchday;}
public void setHomeTeamName(字符串homeTeamName){this.homeTeamName=homeTeamName;}
public void setAwayTeamName(字符串awayTeamName){this.awayTeamName=awayTeamName;}
public void setGoalsHomeTeam(整数goalsHomeTeam){this.goalsHomeTeam=goalsHomeTeam;}
public void setGoalsAwayTeam(整数goalsAwayTeam){this.goalsAwayTeam=goalsAwayTeam;}
public void setFixtures(列出fixtures){this.fixtures=fixtures;}
公共字符串toString(){
如果(date!=null){//很混乱,可以快速编码,但可以正常工作
String[]split=date.split(“T”);
字符串[]split2=split[0]。split(“”);
日期=split2[1]+“/”+split2[2]+“/”+split2[0];
字符串[]split3=split[1]。split(“:”);
整数小时=Integer.parseInt(split3[0])-7;//转换为东部
日期+=“+hour+”:“+split3[1];
}
字符串输出=字符串。格式(“\n固定装置:%-1s比赛日:%-1d日期:%-18s主队:%-25s客队:%-25s”,固定装置,比赛日,日期,主队名称,awayTeamName);
返回输出;
}
}
我希望它最终能在自己的行上输出每一个比赛日,并且每个变量都有适当的间隔。任何帮助/指导都将不胜感激。我以前从未有过GSON的任何经验;然而,我以前使用过JSOUP,这是关于我的知识和情况的一些额外信息
另外,cURL请求是(不带
'X-Auth-Token'
):cURL-H'X-Response-Control:minified'-X-GEThttp://api.football-data.org/v1/teams/66/fixtures
当使用GSON和类似的JSON库时,关键是要有与JSON结构匹配的数据结构。查看来自服务器的JSON响应,我看到:
{
"_links": {
"_self": {
"href": "http://api.football-data.org/v1/teams/81/fixtures"
},
"team": {
"href": "http://api.football-data.org/v1/teams/81"
}
},
"count": 44,
"fixtures": [
{
"_links": {
"self": {
"href": "http://api.football-data.org/v1/fixtures/147488"
},
"soccerseason": {
"href": "http://api.football-data.org/v1/soccerseasons/399"
},
"homeTeam": {
"href": "http://api.football-data.org/v1/teams/77"
},
"awayTeam": {
"href": "http://api.football-data.org/v1/teams/81"
}
},
"date": "2015-08-23T16:30:00Z",
"status": "FINISHED",
"matchday": 1,
"homeTeamName": "Athletic Club",
"awayTeamName": "FC Barcelona",
"result": {
"goalsHomeTeam": 0,
"goalsAwayTeam": 1
}
},
...array continues with your Data objects...
看起来您的数据
类在响应中是一个夹具
。这里有两种方法可以让GSON正确地解析它
- 为表示外部对象的响应创建一个容器。这可能是最常见和最好的方法,因为它非常清楚JSON的结构是什么样子,并且遵循与GSON解析其余部分相同的格式
然后从数组中解析public static class DataContainer { private int count; private Data[] fixtures; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public Data[] getFixtures() { return fixtures; } public void setFixtures(Data[] fixtures) { this.fixtures = fixtures; } }
数据
对象
DataContainer data = new Gson().fromJson(json, DataContainer.class); for(Data fixture : data.fixtures) { System.out.println(fixture); }
- 如果您不喜欢包装器选项,也可以将JSON解析为直接从
提供的JsonParser
。然后,您可以从对象中检索JsonElement
元素,并将其转换为“fixtures”
数据的数组
JsonElement responseElement = new JsonParser().parse(json); Data[] dataArray = new Gson().fromJson(responseElement.getAsJsonObject().get("fixtures"), Data[].class); for(Data fixture : dataArray ) { System.out.println(fixture); }
<> >类名<代码>数据< /代码>非常模糊,可能考虑镜像API的代码>代码> < /P> < P>当使用GSON和类似的JSON库的关键时,您有与JSON结构相匹配的数据结构。查看来自服务器的JSON响应,我看到:
{
"_links": {
"_self": {
"href": "http://api.football-data.org/v1/teams/81/fixtures"
},
"team": {
"href": "http://api.football-data.org/v1/teams/81"
}
},
"count": 44,
"fixtures": [
{
"_links": {
"self": {
"href": "http://api.football-data.org/v1/fixtures/147488"
},
"soccerseason": {
"href": "http://api.football-data.org/v1/soccerseasons/399"
},
"homeTeam": {
"href": "http://api.football-data.org/v1/teams/77"
},
"awayTeam": {
"href": "http://api.football-data.org/v1/teams/81"
}
},
"date": "2015-08-23T16:30:00Z",
"status": "FINISHED",
"matchday": 1,
"homeTeamName": "Athletic Club",
"awayTeamName": "FC Barcelona",
"result": {
"goalsHomeTeam": 0,
"goalsAwayTeam": 1
}
},
...array continues with your Data objects...