如何从返回HTML的URL返回JSON响应

时间:2018-07-16 23:53:32

标签: java html json rest craigslist

首先,有一些背景知识:- 我正在尝试解决一个采访者最近提出的问题。我不得不编写代码并使用下面的URL返回JSON响应- https://losangeles.craigslist.org/

这就是我所做的:- 1)我创建了一个Web客户端,并发出HTTPURL请求以获取HTTP响应。

public static JSONArray getSearchResults(String arg) {
    JSONArray jsonArray = null;
    try {

        QueryString qs = new QueryString("query", arg);

        URL url = new URL("https://toronto.craigslist.ca/search?"+qs);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "application/text");

        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + conn.getResponseCode());
        }


        BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));

        String readAPIResponse = " ";
        StringBuilder output = new StringBuilder();

        while ((readAPIResponse = br.readLine()) != null) {
            output.append(readAPIResponse);
        }

        jsonArray = convertToJson(output);
        System.out.println(" JSON response : "+jsonArray.toString(2));

        conn.disconnect();
      } catch (MalformedURLException e) {

        e.printStackTrace();

      } catch (IOException e) {

        e.printStackTrace();

      }

    return jsonArray;
}

2)以下是我将响应转换为JSON的函数:-

public static JSONArray convertToJson(StringBuilder response) {
    JSONArray jsonArr = new JSONArray();
    if (response != null) {
        try {
            Document document = Jsoup.parse(response.toString());

            Elements resultRows = document.getElementsByClass("result-row");

            JSONObject jsonObj;

            for (int i = 0; i < resultRows.size(); i++) {

                jsonObj = new JSONObject();

                Element e = resultRows.get(i);
                Elements resultsDate = e.getElementsByClass("result-date");

                Elements resultsTitle = e.getElementsByClass("result-title hdrlnk");

                String key1 = "date";
                String value1 = resultsDate.get(0).text();
                jsonObj.put(key1, value1);

                String key2 = "title";
                String value2 = resultsTitle.get(0).text();
                jsonObj.put(key2, value2);

                jsonArr.put(i, jsonObj);

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    return jsonArr;
}

我收到的响应是整个HTML页面(我使用邮递员进行请求)。由于我只有几个小时来解决这个问题,并且不确定如何解析整个HTML,因此最终使用了名为JSoup的第三方库。我对此并不满意,但最终没有其他选择。

我还没有收到他们的回音,我很好奇这是否是最差的方法,如果可以,那么还有什么更好的选择?他们没有提及我可以使用什么技术。但是,由于我所面试的技能集涉及Java / J2EE,因此我正在考虑以Java实现此功能(尽管不使用Node js) 谢谢!

1 个答案:

答案 0 :(得分:0)

如果您只需要XML解析器,它显然是HTML的基础,则内置在JRE核心API中。
即使在SE版本中,也存在需要解析的软件包:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;

看看这些类,它们对于解析或创建XML / HTML文件是最重要的

DocumentBuilderFactory
DocumentBuilder
Document

这里是HTML的简单示例

String text = "<html><head>HEAD</head><body>BODY</body>";
ByteArrayInputStream input = new ByteArrayInputStream(text.getBytes("UTF-8"));
Document doc = builder.parse(input);