Java 使用stackexchange API将请求解析为json
我正在努力解决一些与http、java和StackExchangeAPI相关的问题 将以下URL视为字符串:Java 使用stackexchange API将请求解析为json,java,json,stackexchange-api,Java,Json,Stackexchange Api,我正在努力解决一些与http、java和StackExchangeAPI相关的问题 将以下URL视为字符串: private static final String URLSTRING_2 = "http://freegeoip.net/json/"; 如果我在浏览器中写入此url,我会得到json的回答: 现在我试着用java和本地libs来实现这一点,因为我使用下面的代码段,到目前为止,它工作得很好 如果我解析json并尝试获取键“country_name”的值,那么
private static final String URLSTRING_2 = "http://freegeoip.net/json/";
如果我在浏览器中写入此url,我会得到json的回答:
现在我试着用java和本地libs来实现这一点,因为我使用下面的代码段,到目前为止,它工作得很好
如果我解析json并尝试获取键“country_name”的值,那么代码片段将打印为spected“Singapore”
现在我的问题是: 如果我对这个链接也这么做 我的浏览器输出以下json: 但是如果我试图解析json,我会得到一个异常,因为我从请求中得到以下信息: ýýýýýýýýýýýýýýýýýýýý253 对于一些甚至不是人类可读的东西 你知道为什么吗
提前感谢StackOverflow API GZIP压缩其响应。您看到非人类可读字符字符串的原因是您试图读取GZIP压缩数据,而无需先解压缩它 您的浏览器能够读取此标题并自行进行解压缩。您的代码尚未解压 您可以通过在响应中显示的值来确认使用了GZIP压缩
System.out.println(request.getContentEncoding());
将打印出来
gzip
幸运的是,解决这个问题相当简单。您需要将从请求中获得的InputStream
包装为:
但是,我建议不要使用内置的Java类,而是使用一个库,例如用于发出HTTP请求。特别是,这样的库将自动检测内容编码并为您执行解压缩
gzip
final JsonElement root = jp.parse(new InputStreamReader(new GZIPInputStream((InputStream) request.getContent()))); // Convert the input stream to a json