0

我有一段示例代码可以从网站请求数据,而我得到的响应却是胡言乱语。

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 对象。发现了一些问题,但他们已经有了回应并试图解析。

4

1 回答 1

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
Vary: Accept-Encoding
Content -编码:gzip
Keep-Alive:timeout=5,max=100
连接:Keep-Alive
传输编码:chunked
Content-Type:application/json

这就是为什么您的输出看起来像“胡言乱语”的原因。要解决此问题,只需GZIPInputStream在 URL 连接输出流之上链接 a。

// 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);
于 2013-05-10T16:28:45.117 回答