使用 stackexchange API 将请求解析为 json
Parsing Request as json with stackexchange API
我正在努力解决一些与 http、java 和 stackexchange API 相关的问题
将以下 url 视为字符串:
private static final String URLSTRING_2 = "http://freegeoip.net/json/";
如果我在我的浏览器中写 url 我得到的答案是 json:
现在我正在尝试使用 java 并且仅使用本机库,因为我正在使用下面的代码片段,到目前为止效果很好...
如果我解析 json 并尝试获取键“country_name”的值,则该代码段会按预期打印“Singapore”
public static void main(String[] args) throws Exception {
// Connect to the URL using java's native library
final URL url = new URL(URLSTRING_2);
final HttpURLConnection request = (HttpURLConnection) url.openConnection();
request.connect();
// Convert to a JSON object to print data
final JsonParser jp = new JsonParser(); // from gson
final JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); // Convert the input stream to a json
// element
final JsonObject rootobj = root.getAsJsonObject(); // May be an array, may be an object.
final String country = rootobj.get("country_name").getAsString(); // just grab the zipcode
System.out.println("country_name: " + country);
}
现在我的问题是:
如果我也这样做 link
https://api.stackexchange.com//2.2/users/22656?order=desc&sort=reputation&site=Whosebug&filter=!T6oHjO_RIWkfWpoL5g
我的浏览器输出如下 json:
但是如果我尝试解析 json 我会得到一个异常,因为我从请求中得到这个:
ý•@‡ž¼ÚRìØ1ôX`»v?±h[‹-¹’/+ò........
对于人类甚至无法阅读的内容...
你知道为什么吗?
提前致谢
Whosebug API GZIP-compresses 其响应。您看到 non-human-readable 个字符的字符串的原因是您试图读取 GZIP-compressed 数据而不先解压缩它。
您的浏览器能够读取此 header 并自行解压缩。您的代码还没有。
您可以通过在响应中显示 Content-Encoding header 的值来确认使用了 GZIP 压缩。添加行
System.out.println(request.getContentEncoding());
会打印出来
gzip
幸运的是,解决问题相当简单。您需要将从请求中获得的 InputStream
包装在 GZIPInputStream
:
final JsonElement root = jp.parse(new InputStreamReader(new GZIPInputStream((InputStream) request.getContent()))); // Convert the input stream to a json
但是,我建议您使用 Apache HTTPComponents Client 等库来发出 HTTP 请求,而不是 built-in Java 类。特别是,像这样的库会自动检测 content-encoding 并为您解压。
我正在努力解决一些与 http、java 和 stackexchange API 相关的问题 将以下 url 视为字符串:
private static final String URLSTRING_2 = "http://freegeoip.net/json/";
如果我在我的浏览器中写 url 我得到的答案是 json:
现在我正在尝试使用 java 并且仅使用本机库,因为我正在使用下面的代码片段,到目前为止效果很好...
如果我解析 json 并尝试获取键“country_name”的值,则该代码段会按预期打印“Singapore”
public static void main(String[] args) throws Exception {
// Connect to the URL using java's native library
final URL url = new URL(URLSTRING_2);
final HttpURLConnection request = (HttpURLConnection) url.openConnection();
request.connect();
// Convert to a JSON object to print data
final JsonParser jp = new JsonParser(); // from gson
final JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); // Convert the input stream to a json
// element
final JsonObject rootobj = root.getAsJsonObject(); // May be an array, may be an object.
final String country = rootobj.get("country_name").getAsString(); // just grab the zipcode
System.out.println("country_name: " + country);
}
现在我的问题是:
如果我也这样做 link https://api.stackexchange.com//2.2/users/22656?order=desc&sort=reputation&site=Whosebug&filter=!T6oHjO_RIWkfWpoL5g
我的浏览器输出如下 json:
但是如果我尝试解析 json 我会得到一个异常,因为我从请求中得到这个:
ý•@‡ž¼ÚRìØ1ôX`»v?±h[‹-¹’/+ò........
对于人类甚至无法阅读的内容...
你知道为什么吗?
提前致谢
Whosebug API GZIP-compresses 其响应。您看到 non-human-readable 个字符的字符串的原因是您试图读取 GZIP-compressed 数据而不先解压缩它。
您的浏览器能够读取此 header 并自行解压缩。您的代码还没有。
您可以通过在响应中显示 Content-Encoding header 的值来确认使用了 GZIP 压缩。添加行
System.out.println(request.getContentEncoding());
会打印出来
gzip
幸运的是,解决问题相当简单。您需要将从请求中获得的 InputStream
包装在 GZIPInputStream
:
final JsonElement root = jp.parse(new InputStreamReader(new GZIPInputStream((InputStream) request.getContent()))); // Convert the input stream to a json
但是,我建议您使用 Apache HTTPComponents Client 等库来发出 HTTP 请求,而不是 built-in Java 类。特别是,像这样的库会自动检测 content-encoding 并为您解压。