Java Github存储库搜索

时间:2019-03-19 23:50:21

标签: java jsonpath

我正在制作一个基于Java的CLI应用程序,可以在其中搜索Github存储库及其最新标签。为此,我构建了一个程序,该程序调用Github API,并捕获最高星级的存储库名称及其所有者。当您运行下面的代码时,此功能返回“ cbeust”,此功能正常运行。

我的第二步是使用所有者和存储库名称(url2)捕获最新的标签,但是当我调用程序进行捕获时,它确实运行了,但未产生预期的输出。

请查看我的程序,让我知道我在做什么错?

package com.github_search;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import com.jayway.jsonpath.JsonPath;
import org.apache.log4j.BasicConfigurator;
import org.json.JSONException;
import org.json.JSONObject;

public class github_search
{
    public static void main(String[] args) {
        try {
            BasicConfigurator.configure();
            String Name = "TESTNG";
            String Tags = "6.4.0";
            String url1 = "https://api.github.com/search/repositories?q="+ Name +"&sort=stars&order=desc";
            List<String> authors = JsonPath.read(github_search.search(url1).toString(), "$.items[*].owner.login");
            System.out.println("Owner: (" + authors.get(0) +")");
            String url2 = "https://api.github.com/repos/"+authors.get(0)+"/"+Name+"/tags";
            List<String> latest_tags = JsonPath.read(github_search.search(url2).toString(), "$..name");
            System.out.println("first tag: (" + latest_tags.get(0) +")");
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    public static String search(String url) throws IOException, JSONException {
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("User-Agent", "Mozilla/5.0");
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        JSONObject obj_JSONObject = new JSONObject(response.toString());
        return obj_JSONObject.toString();
    }
}

电流输出

0 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath  - Evaluating path: $['items'][*]['owner']['login']
Owner: (cbeust)

预期产量

0 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath  - Evaluating path: $['items'][*]['owner']['login']
Owner: (cbeust)
first tag: (testng-6.9.5)

标签请求的JSON响应

[
  {
    "name": "testng-6.9.5",
    "zipball_url": "https://api.github.com/repos/cbeust/testng/zipball/testng-6.9.5",
    "tarball_url": "https://api.github.com/repos/cbeust/testng/tarball/testng-6.9.5",
    "commit": {
      "sha": "ef2d1199abff4e1b8fa4b1148c1314e776d7a044",
      "url": "https://api.github.com/repos/cbeust/testng/commits/ef2d1199abff4e1b8fa4b1148c1314e776d7a044"
    },
    "node_id": "MDM6UmVmNzQ1NzQ5OnRlc3RuZy02LjkuNQ=="
  },
  {
  ...
  }
]

1 个答案:

答案 0 :(得分:1)

这里的问题是您对search()的第二次调用引发异常,您在catch块中吞下了该异常,因此main方法失败并退出,然后才能打印出{{1 }},因此您只会看到此调用的输出:latest_tags.get(0)

您第一次调用GitHub API的响应如下:

System.out.println(authors.get(0))

是单个JSON“对象”,因此此调用成功:{ "total_count": 6345, "incomplete_results": false, "items": [...] }

但是,对您第二次调用GitHub API的响应如下:

new JSONObject(response.toString())

因此,这是JSON“对象”的数组(请注意方括号括起来的方式),因此此调用:[ { "name": "testng-6.9.5", "zipball_url": "https://api.github.com/repos/cbeust/testng/zipball/testng-6.9.5", "tarball_url": "https://api.github.com/repos/cbeust/testng/tarball/testng-6.9.5", "commit": { "sha": "ef2d1199abff4e1b8fa4b1148c1314e776d7a044", "url": "https://api.github.com/repos/cbeust/testng/commits/ef2d1199abff4e1b8fa4b1148c1314e776d7a044" }, "node_id": "MDM6UmVmNzQ1NzQ5OnRlc3RuZy02LjkuNQ==" }, ... ] 失败,并显示为...

new JSONObject(response.toString())

因此,这说明了为什么只看到第一个预期的输出。现在,要解决此问题,您只需替换这些行...

Value [...] of type org.json.JSONArray cannot be converted to JSONObject

...与此:

JSONObject obj_JSONObject = new JSONObject(response.toString());
return obj_JSONObject.toString();

为完整起见,请在return response.toString() 方法的catch块中提供一些实现,以免被误吞的异常所误导。