JSON响应并将其转换为JSON对象

时间:2013-05-10 09:10:02

标签: json

我有一段示例代码来请求来自网站的数据,而我得到的回应结果是胡言乱语。

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

1 个答案:

答案 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);