我正在制作一个基于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)
[
{
"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=="
},
{
...
}
]
答案 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块中提供一些实现,以免被误吞的异常所误导。