【问题标题】:How to return JSON response from a URL returning HTML如何从返回 HTML 的 URL 返回 JSON 响应
【发布时间】:2018-12-24 13:39:53
【问题描述】:

首先,一些背景:- 我正在尝试解决最近面试官提出的一个问题。我必须编写代码并使用下面的 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 的第三方库。我对此不是 100% 满意,但最终别无选择。

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

【问题讨论】:

  • 如果不知道确切面试官的期望,这不是一个可以回答的问题。 “如何将 HTML 转换为 JSON”是 XY Problem。显然这不是面试官要问的。如果您明确告诉我们:“我们应该请求一个 HTML 页面,并将其废弃为 X 数据并以 JSON 格式返回”,这将是一个合适的问题,但不清楚这是面试官要问的。
  • 请澄清你的问题!你到底会知道什么?
  • 感谢@PaulSamsotha 指出。你是绝对正确的!我的错。是的,问题应该是 - “我们应该请求一个 HTML 页面,并将其废弃为 X 数据并以 JSON 格式返回”。你有什么指示吗?我也会尝试下面的答案,但我也很想得到你的推荐!
  • @Niton,正如面试官所说的那样,我只知道-“craigslist URL 需要直接访问,它本身不会返回 JSON”希望它能回答你的问题吗?

标签: java html json rest craigslist


【解决方案1】:

如果您只需要一个 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);

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 2017-09-13
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2018-05-13
    相关资源
    最近更新 更多