维基百科中的 opensearch 结果为 java 中的 jsonobject [英] opensearch in wikipedia result as jsonobject in java

查看:35
本文介绍了维基百科中的 opensearch 结果为 java 中的 jsonobject的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在维基百科中使用 opensearch(因为结果就是我要找的)并使用 java 解析这个查询的结果:

https://fr.wikipedia.org/w/api.php?action=opensearch&search=soleil&format=json

但结果看起来不像 json 格式:

<预><代码> ["太阳",["太阳","Soleil vert","太阳神",皇家太阳(1749)",Soleil Moon Frye",Soleil Levant(电影)",皇家太阳(1669)",Soleil trompeur",太阳制作",Soleils(协会)"],["Le Soleil est l'étoile du Système solaire.Dans la Classification astronomique, c'est une étoile de type naine jaune d'une masse d'environ 1,9891 ×\u202f1030 kg, composée d'hydrogène (75 % de la masseou 92 % du volume) et d'hélium (25% de la masse ou 8% du volume).","Soleil vert (Soylent Green) est un film americain d'anticipation réalisé par Richard Fleischer, sorti en 1973 et inspiré du roman Make room!","Soleilhas est une community française, située dans le département des Alpes-de-Haute-Provence en région Provence-Alpes-Côte d'Azur.",Le Soleil-Royal est un navire de guerre français en service de 1750 à 1759.C'est un vaisseau de ligne de deuxième rang à deux ponts portant 80 canons, le troisième du nom dans la Marine française.""Soleil Moon Frye est une actrice américaine, née le 6 août 1976, à Glendora, California.",Soleil Levant (Rising Sun) est un 惊悚片 américain réalisé par Philip Kaufman, sorti en 1993. Le film met en vedette Sean Connery (également producteur délégué du film), Wesley Snipes, Harvey Keitel et Cary-Hiroyuki Tagawa,""Le Soleil-Royal est un navire de guerre français, en service de 1669 à 1692. C'est un vaisseau de ligne de Premier rang, portant 98 puis 104 canons sur trois ponts.","Soleil trompeur (俄语:Утомлённые солнцем, Outomlionnyïé solntsem) est un film du réalisateur et acteur russe Nikita Mikhalkov, sorti en salles en 1994.du jury au Festival de Cannes.","Soleil Productions est un éditeur français de bande dessinée localisé à Toulon.",Soleils est une association à but humanitaire impertainée sur lecampus rennais de Supélec (École Supérieure d'Electricité)."],["https://fr.wikipedia.org/wiki/Soleil","https://fr.wikipedia.org/wiki/Soleil_vert","https://fr.wikipedia.org/wiki/Soleilhas","https://fr.wikipedia.org/wiki/Soleil_Royal_(1749)","https://fr.wikipedia.org/wiki/Soleil_Moon_Frye","https://fr.wikipedia.org/wiki/Soleil_levant_(电影)","https://fr.wikipedia.org/wiki/Soleil_Royal_(1669)","https://fr.wikipedia.org/wiki/Soleil_trompeur","https://fr.wikipedia.org/wiki/Soleil_Productions",https://fr.wikipedia.org/wiki/Soleils_(协会)"]]

而且我不知道如何在我的 java 代码中使用它作为列表(使用 commons-io-2.6.jar 和 java-json.jar):

String url = "https:///fr.wikipedia.org/w/api.php?action=opensearch&search=soleil&format=json";

 String jsonText = IOUtils.toString(new URL(url), Charset.forName("UTF-8"));JSONObject json = new JSONObject(jsonText);json.getJSONArray(key);//json 中没有键

解决方案

维基百科的响应当然是一个有效的 JSON,虽然结构有点不幸.他们这样做是为了节省传输(因为他们不必在响应 JSON 中包含密钥).

现在回到那个数组结构:

  • 第一个元素是查询字符串.
  • 第二个元素是一个包含找到页面标题的数组.
  • 第三个元素是一个包含已找到页面描述的数组.
  • 第四个元素是一个数组,包含找到的页面的 URL.

读取此响应的示例代码(使用 Jackson,行业标准 JSON 库):

public void printWikipediaResults() 抛出 IOException {JsonNode tree = new ObjectMapper().readTree("");//获取结果数(标题数组的长度)int totalResults = tree.get(1).size();//初始化一个新的 ArrayList 来存储 WikiArticles列表<维基文章>结果 = 新的 ArrayList<>(totalResults);//对于每篇文章,从包含在数组中的数据创建一个新对象for (int i = 0; i < totalResults; i++) {结果.添加(新维基文章(tree.get(1).get(i).asText(),tree.get(2).get(i).asText(),tree.get(3).get(i).asText()));}System.out.println("显示结果:" + tree.get(0).asText());对于(维基文章文章:结果){System.out.println(article.title + ":" + article.url);}}公共静态类维基文章{公共字符串标题;公共字符串描述;公共字符串网址;公共维基文章(字符串标题,字符串描述,字符串网址){this.title = 标题;this.desc = desc;this.url = url;}}

结果:

显示结果:soleil太阳:https://fr.wikipedia.org/wiki/SoleilSoleil vert:https://fr.wikipedia.org/wiki/Soleil_vertSoleilhas:https://fr.wikipedia.org/wiki/Soleilhas皇家太阳 (1749):https://fr.wikipedia.org/wiki/Soleil_Royal_(1749)Soleil Moon Frye:https://fr.wikipedia.org/wiki/Soleil_Moon_FryeSoleil Levant(电影):https://fr.wikipedia.org/wiki/Soleil_levant_(电影)皇家太阳 (1669):https://fr.wikipedia.org/wiki/Soleil_Royal_(1669)Soleil trompeur:https://fr.wikipedia.org/wiki/Soleil_trompeur太阳制作:https://fr.wikipedia.org/wiki/Soleil_ProductionsSoleils(协会):https://fr.wikipedia.org/wiki/Soleils_(association)

I want to use opensearch in wikipedia (cause the results is what I look for) and parse the result of this query using java :

https://fr.wikipedia.org/w/api.php?action=opensearch&search=soleil&format=json

But the result does not look as json format :

    [
  "soleil",
  [
    "Soleil",
    "Soleil vert",
    "Soleilhas",
    "Soleil Royal (1749)",
    "Soleil Moon Frye",
    "Soleil levant (film)",
    "Soleil Royal (1669)",
    "Soleil trompeur",
    "Soleil Productions",
    "Soleils (association)"
  ],
  [
    "Le Soleil est l’étoile du Système solaire. Dans la classification astronomique, c’est une étoile de type naine jaune d'une masse d'environ 1,9891 ×\u202f1030 kg, composée d’hydrogène (75 % de la masse ou 92 % du volume) et d’hélium (25 % de la masse ou 8 % du volume).",
    "Soleil vert (Soylent Green) est un film américain d'anticipation réalisé par Richard Fleischer, sorti en 1973 et inspiré du roman Make room!",
    "Soleilhas est une commune française, située dans le département des Alpes-de-Haute-Provence en région Provence-Alpes-Côte d'Azur.",
    "Le Soleil-Royal est un navire de guerre français en service de 1750 à 1759. C'est un vaisseau de ligne de deuxième rang à deux ponts portant 80 canons, le troisième du nom dans la marine française.",
    "Soleil Moon Frye est une actrice américaine, née le 6 août 1976, à Glendora, Californie.",
    "Soleil levant (Rising Sun) est un thriller américain réalisé par Philip Kaufman, sorti en 1993. Le film met en vedette Sean Connery (également producteur délégué du film), Wesley Snipes, Harvey Keitel et Cary-Hiroyuki Tagawa.",
    "Le Soleil-Royal est un navire de guerre français, en service de 1669 à 1692. C'est un vaisseau de ligne de premier rang, portant 98 puis 104 canons sur trois ponts.",
    "Soleil trompeur (en russe : Утомлённые солнцем, Outomlionnyïé solntsem) est un film du réalisateur et acteur russe Nikita Mikhalkov, sorti en salles en 1994. Ce film a été récompensé par l'Oscar du meilleur film en langue étrangère et par le Grand Prix du jury au festival de Cannes.",
    "Soleil Productions est un éditeur français de bande dessinée localisé à Toulon.",
    "Soleils est une association à but humanitaire implantée sur le campus rennais de Supélec (École Supérieure d'Electricité)."
  ],
  [
    "https://fr.wikipedia.org/wiki/Soleil",
    "https://fr.wikipedia.org/wiki/Soleil_vert",
    "https://fr.wikipedia.org/wiki/Soleilhas",
    "https://fr.wikipedia.org/wiki/Soleil_Royal_(1749)",
    "https://fr.wikipedia.org/wiki/Soleil_Moon_Frye",
    "https://fr.wikipedia.org/wiki/Soleil_levant_(film)",
    "https://fr.wikipedia.org/wiki/Soleil_Royal_(1669)",
    "https://fr.wikipedia.org/wiki/Soleil_trompeur",
    "https://fr.wikipedia.org/wiki/Soleil_Productions",
    "https://fr.wikipedia.org/wiki/Soleils_(association)"
  ]
]

And I don't know how to use it as a list in my java code (using commons-io-2.6.jar and java-json.jar) :

String url = "https://fr.wikipedia.org/w/api.php?action=opensearch&search=soleil&format=json";

    String jsonText = IOUtils.toString(new URL(url), Charset.forName("UTF-8"));

    JSONObject json = new JSONObject(jsonText);

    json.getJSONArray(key); // no key in the json

解决方案

The wikipedia response certainly is a valid JSON, although the structure is a bit unfortunate. They do it this way to save transfers ( as they don't have to include the keys in the response JSON ).

Now back to that array structure:

  • First element is the query string.
  • Second element is an array containing titles of found pages.
  • Third element is an array containing descriptions of found pages.
  • Fourth element is an array containing URLs of found pages.

Example code for reading this response ( using Jackson, industry standard JSON library ):

public void printWikipediaResults() throws IOException {
    JsonNode tree = new ObjectMapper().readTree("<Wikipedia JSON>");

    // get number of results ( length of titles array )
    int totalResults = tree.get(1).size();
    // initialize a new ArrayList to store the WikiArticles into
    List<WikiArticle> results = new ArrayList<>(totalResults);
    // for each article, create a new object from the data contained in the arrays
    for (int i = 0; i < totalResults; i++) {
        results.add(new WikiArticle(
                tree.get(1).get(i).asText(),
                tree.get(2).get(i).asText(),
                tree.get(3).get(i).asText()
        ));
    }

    System.out.println("Showing results for: " + tree.get(0).asText());
    for (WikiArticle article : results) {
        System.out.println(article.title + ": " + article.url);
    }
}

public static class WikiArticle {
    public String title;
    public String desc;
    public String url;

    public WikiArticle(String title, String desc, String url) {
        this.title = title;
        this.desc = desc;
        this.url = url;
    }
}

Result:

Showing results for: soleil
Soleil: https://fr.wikipedia.org/wiki/Soleil
Soleil vert: https://fr.wikipedia.org/wiki/Soleil_vert
Soleilhas: https://fr.wikipedia.org/wiki/Soleilhas
Soleil Royal (1749): https://fr.wikipedia.org/wiki/Soleil_Royal_(1749)
Soleil Moon Frye: https://fr.wikipedia.org/wiki/Soleil_Moon_Frye
Soleil levant (film): https://fr.wikipedia.org/wiki/Soleil_levant_(film)
Soleil Royal (1669): https://fr.wikipedia.org/wiki/Soleil_Royal_(1669)
Soleil trompeur: https://fr.wikipedia.org/wiki/Soleil_trompeur
Soleil Productions: https://fr.wikipedia.org/wiki/Soleil_Productions
Soleils (association): https://fr.wikipedia.org/wiki/Soleils_(association)

这篇关于维基百科中的 opensearch 结果为 java 中的 jsonobject的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆