2013-05-19 3 views
3

Я использую API-интерфейс Stackoverflow JSON для получения вопросов, отмеченных заданным тегом.Как настроить количество результатов, возвращаемых при запросе API Stackoverflow?

У меня есть эта небольшая программа на Java, которая извлекает вопросы, отмеченные тегом «Java».

public static void main(String[] args) throws Exception 
{ 
    String urlString = "https://api.stackexchange.com/2.1/questions?order=desc&sort=votes&tagged=java&site=stackoverflow"; 

    URL url = new URL(urlString); 

    BufferedReader reader = null; 

    StringBuffer buffer = new StringBuffer(); 
    try 
    { 
     URLConnection connection = url.openConnection(); 

     InputStream isConn = connection.getInputStream(); 

     reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(isConn))); 

     String inputLine; 

     while ((inputLine = reader.readLine()) != null) 
     { 
      buffer.append(inputLine); 
     } 
    } 
    finally 
    { 
     if (reader != null) 
     { 
      reader.close(); 
     } 
    } 

    JSONObject jsonObject = new JSONObject(buffer.toString()); 

    JSONArray jsonArray = jsonObject.getJSONArray("items"); 

    System.out.println(buffer); 
    System.out.println(jsonArray.length()); 
} 

Моя проблема в том, что она возвращает только 30 вопросов. Поскольку моя цель состоит в создании набора данных для дальнейшего текстового анализа, мне нужно получить доступ к более чем 30 вопросам.

Есть ли способ настроить размер возвращаемого списка?

Если нет, то как я могу обход этой ситуации?

ответ

2

Отметьте has_more недвижимостью в возвращенном JSON, это означает, что имеется больше результатов. Вы можете просмотреть эти результаты с помощью параметров page и pagesize в URL-адресе. Проблема, которую я предвижу, заключается в том, что код будет тянуть большое количество вопросов, учитывая, что он будет проходить через все java-вопросы, поэтому вы можете захотеть добавить условие, которое останавливается на определенном количестве страниц. Вот краткий пример:

public static void main(String[] args) throws Exception { 

    BufferedReader reader = null; 
    int page = 1; 
    JSONObject jsonObject = null; 
    try { 
     while (jsonObject == null || jsonObject.getBoolean("has_more")) { 
      String urlString = "https://api.stackexchange.com/2.1/questions?order=desc&sort=votes&tagged=java&site=stackoverflow&pagesize=100"; 
      urlString += "&page=" + page++; 
      URL url = new URL(urlString); 
      URLConnection connection = url.openConnection(); 

      InputStream isConn = connection.getInputStream(); 
      StringBuffer buffer = new StringBuffer(); 
      reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(isConn))); 

      String inputLine; 

      while ((inputLine = reader.readLine()) != null) { 
       buffer.append(inputLine); 
      } 

      jsonObject = new JSONObject(buffer.toString()); 
      JSONArray jsonArray = jsonObject.getJSONArray("items"); 

      System.out.println(buffer); 
      System.out.println(jsonArray.length()); 
     } 
    } finally { 
     if (reader != null) { 
      reader.close(); 
     } 
    } 

} 
+0

См. Обновленный код. –

+0

Ответ на вопросы, отмеченные тегом Java, был просто примером. На практике я буду использовать более строгие фильтры. Но я обязательно добавлю условие остановки, основанное на количестве полученных страниц. Спасибо за ответ. – EijiAdachi

+0

@ EijiAdachi Рад, что я мог бы помочь. Хороший вопрос! –

Смежные вопросы