Статьи

Парсинг ESPN API с использованием Java и Google GSON

Для моего первого поста я объясню, как анализировать ESPN API. Документацию по API можно найти по адресу http://developer.espn.com/docs .

Во-первых, вам нужно запросить ключ API, затем вы можете начать запрашивать API REST для получения ответа JSON. В следующем примере я собираюсь просто запросить всех игроков в спорте «Футбол» (черт возьми, американизм), которые играют в Премьер-лиге в Англии.

После прочтения документации, это URL, на который мне нужно отправлять запросы (с заменой на [apiKey] правильное значение).

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

Прежде всего следует иметь в виду, что есть значение смещения, которое заставляет вас делать несколько запросов, если вы хотите больше, чем 50 результатов, это устанавливается с помощью параметра, известного как смещение. Так, например, чтобы получить результаты от 51-101, следующий запрос должен был бы их вернуть. Мы вернемся к этому позже, так как это может вызвать некоторые незначительные проблемы.

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

Теперь у меня есть описание, я начну код, следует отметить, что я использую GSON для анализа JSON, поэтому вам нужно добавить следующую зависимость Maven.

1
2
3
4
5
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.2.2</version>
</dependency>

Как только это будет сделано, и вы запустите maven: install для загрузки jar-файлов, вы можете начать запрашивать. Приведенный ниже код просто необходим для загрузки JSON из ESPN API

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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 содержит много избыточных данных, я решил не разбирать их на объекты и просто запросил их в необработанном виде.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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 of Athletes и связанные с ними данные, которые можно получить о них. Следует отметить, что ответ здесь варьируется в зависимости от вашего пособия по API (бесплатное, партнерское, платное и т. Д.). Я оставлю соответствующую страницу API ESPN здесь http://developer.espn.com/docs/athletes#parameters.

Теперь, когда у нас есть соответствующий JsonArray, который мы хотим, мы можем просто просмотреть его, чтобы получить данные о каждом игроке.

01
02
03
04
05
06
07
08
09
10
11
12
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.

Затем, когда мы соберем все это вместе, вы получите класс ниже, это будет проходить через каждого игрока, давая вам свое имя.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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

Ссылка: Разбор ESPN API с использованием Java и Google GSON от нашего партнера JCG Дэвида Грея в блоге Code Mumble .