我有一段示例代码来请求来自网站的数据,而我得到的回应结果是胡言乱语。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class NetClientGet
{
public static void main(String[] args)
{
try
{
URL url = new URL("http://fids.changiairport.com/webfids/fidsp/get_flightinfo_cache.php?d=0&type=pa&lang=en");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200)
{
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
System.out.println("the connection content type : " + conn.getContentType());
// convert the input stream to JSON
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null)
{
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
如何将InputStream转换为可读的JSON对象。发现了一些问题,但他们已经有了回应并试图解析。
答案 0 :(得分:4)
您的代码的第一个问题是服务器正在处理您没有处理的响应数据。您可以通过浏览器检索数据并查看响应标题来轻松验证这一点:
HTTP / 1.1 200 OK
日期:2013年5月10日星期五16:03:45 GMT
服务器:Apache / 2.2.17(Unix)PHP / 5.3.6
X-Powered-By:PHP / 5.3.6
变化:接受编码
内容编码:gzip
保持活跃:超时= 5,最大= 100
连接:保持活力
转移编码:分块
内容类型:application / json
这就是为什么你的输出看起来像'乱码'。要解决此问题,只需在URL连接输出流的顶部链接GZIPInputStream
。
// convert the input stream to JSON
BufferedReader br;
if ("gzip".equalsIgnoreCase(conn.getContentEncoding())) {
br = new BufferedReader(new InputStreamReader(
(new GZIPInputStream(conn.getInputStream()))));
} else {
br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
}
第二个问题是返回的数据实际上是JSONP格式(JSON包含在回调函数中,类似于callback_function_name(JSON);
)。您需要在解析之前解压缩它:
// Retrieve data from server
String output = null;
final StringBuffer buffer = new StringBuffer(16384);
while ((output = br.readLine()) != null) {
buffer.append(output);
}
conn.disconnect();
// Extract JSON from the JSONP envelope
String jsonp = buffer.toString();
String json = jsonp.substring(jsonp.indexOf("(") + 1,
jsonp.lastIndexOf(")"));
System.out.println("Output from server");
System.out.println(json);
就这样,现在您可以从服务器获得所需的数据。此时,您可以使用任何标准JSON库来解析它。例如,使用GSON:
final JSONElement element = new JSONParser().parse(json);