Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GSON在Java中有组织地输出JSON响应_Java_Json_Api_Curl_Gson - Fatal编程技术网

使用GSON在Java中有组织地输出JSON响应

使用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(字符

今天,我决定尝试为自己创建一个应用程序,使用Java显示当前2015-2016赛季的过去和现在的足球比赛

我目前似乎不知道如何正确显示JSON。web API端点是:(在没有API令牌的情况下,每天有50个请求限制)。我试图使用GSON解析JSON,但文档似乎超出了我的理解范围

以下是我目前掌握的代码:

FCBFixtures.java

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...