解析或转换 JSON 响应中 JSON 对象内嵌入的 HTML 代码

Parse or convert HTML code embedded inside JSON object in the JSON response

我有以下 URL :

https://en.wikipedia.org/w/api.php?action=parse&section=0&prop=text&format=json&page=The%20Matrix

其中 returns JSON 响应 HTML 代码 嵌入 JSON对象参见link)。

如何使用 java 从 HTML 部分 检索 演员、导演等详细信息?

如果可能,如何使用 java 将 Html 部分转换为 JSON?

或者有什么方法可以更改 url 本身以获取可读 JSON 格式的电影数据?

这是一个使用 jsoup 解析 HTML 和 jackson 解析 JSON 的解决方案:

public static void main(String[] args) throws IOException {
    // Extract JSON string
    String body = Jsoup.connect("https://en.wikipedia.org/w/api.php?action=parse&section=0&prop=text&format=json&page=The%20Matrix")
    .ignoreContentType(true).execute().body();
    // Extract HTML string from JSON
    JsonFactory factory = new JsonFactory();
    ObjectMapper mapper = new ObjectMapper(factory);
    JsonNode targetNode = mapper.readTree(body).get("parse").get("text").get("*");
    // Generic but fragile function to extract specific details
    Function<String, String> retrieveDetailsOf = detailsOf ->
        Jsoup.parse(targetNode.asText())
                .select(".infobox tr th:contains(" + detailsOf + ") ~ td a[title]")
                .stream().map(e -> e.attr("title")).collect(Collectors.toList()).toString();

    System.out.println(retrieveDetailsOf.apply("Directed by"));
    System.out.println(retrieveDetailsOf.apply("Produced by"));
    System.out.println(retrieveDetailsOf.apply("Music by"));
    System.out.println(retrieveDetailsOf.apply("Starring"));
}

输出:

[The Wachowskis]
[Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss, Hugo Weaving, Joe Pantoliano]

依赖关系:

implementation("org.jsoup:jsoup:1.12.2")
implementation("com.fasterxml.jackson.core:jackson-core:2.10.2")
implementation("com.fasterxml.jackson.core:jackson-databind:2.10.2")

请注意,内容结构的任何更改大多会导致中断。如果可用,请使用官方电影详细信息 API。