如何有效地解析每次进化的 Rest Api 响应

How to parse efficiently a Rest Api response that evolve each time

我不是程序员,所以基础知识浅薄

我想创建一个桌面应用程序,一本字典,你搜索一个词,你有一个简短的定义。

我用那些家伙。

https://api.lexicala.com/

下面是我的脚本的一部分。

我的问题是,对于我搜索的每个部分,单词的含义、性质等

我必须制作这个解封装代码行。 // 编辑:解封装=反序列化

response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONObject("headword").get("text")

如果 Json 没有每次都改变,没问题,但确实如此。

一个形容词和一个名词完全改变了结构,我得到一个错误。

一个 Json 对象现在是一个 Json 数组。

我想知道是否有简单的方法,Jackson 或 Gson 或 Json 简单地问一些像

Json.Parse (JsonResponse);
get("Definition");

而不是

Object Resultat4 = response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONArray("senses").getJSONObject(0).get("definition");

并且只有内容,没有经过所有这些变化的代码行。

谢谢你帮我解决这个问题。

//Values

String motacherch = "grand";



public void  gettest(){



   HttpResponse<JsonNode> response = Unirest.get("https://dictapi.lexicala.com/search?source=global&language=fr&text="+motacherch)
           .basicAuth("user", "password")
           .asJson();

   JSONObject responsejson = (JSONObject) response.getBody().getObject();
   System.out.println( responsejson);


   Object Resultat = response.getBody().getObject().get("n_results");
   System.out.println( "Le nombre de resultats est:"+ Resultat);


    Object Resultat2 = response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONObject("headword").get("text");
    System.out.println( "Le mot que l'on cherche est: "+ Resultat2);
    Object Resultat3 = response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONObject("headword").get("pos");
    System.out.println( "C'est un: "+ Resultat3);
    Object Resultat4 = response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONArray("senses").getJSONObject(0).get("definition");

    System.out.println( "Definition: "+ Resultat4);


    System.out.println( "---------------------------------------------" );

HttpResponse<JsonNode> response2 = Unirest.get("https://dictapi.lexicala.com/users/me")
        .basicAuth("", "")
        .asJson();
    //System.out.println( response2.getBody());
    JSONObject responsejson2 = response2.getBody().getObject();
    JSONObject results = responsejson2.getJSONObject("usage").getJSONObject("today");
    Object results2=results.get("count");
    System.out.println( results2);

}

最简单的方法是使用您最喜欢的库(尝试杰克逊或 gson)。

然后检查地图的键以确定如何处理它。

更难但更“正确”的方法是反序列化为负载属性选择的各种 类,但在这种情况下我不会,因为 API设计听起来有点古怪。


下面是一些将 json 解析为地图的代码:

import com.fasterxml.jackson.databind.ObjectMapper;

Map<String, Object> map = (HashMap<String, Object>) new ObjectMapper().readValue(jsonStr, LinkedHashMap.class); // LinkedHashMap will preserve order

为了更轻松地访问映射值,您可能会发现这个通过推理进行转换的辅助方法非常方便:

static <T> T getValue(Map<String, Object> map, String key) {
    return (T)map.get(key);
}

这样使用:

List<Map<String, Object>> list = getValue(map, "results"); // no cast needed

Json:

{"n_results":1,"page_number":1,"results_per_page":10,"n_pages":1,"available_n_pages":1,"results":[{"id":"FR_DE00114905","language":"fr","headword":{"text":"briser","pos":"verb"},"senses":[{"id":"FR_SE00126791","definition":"réduire en morceaux"},{"id":"FR_SE00002638","definition":"détruire"}]}]}

部分代码:

String motacherch = "briser";



public void  gettest() throws IOException {



    HttpResponse<JsonNode> response = Unirest.get("https://dictapi.lexicala.com/search?source=global&language=fr&text="+motacherch)
            .basicAuth("user", "password")
            .asJson();
    System.out.println( "---------------------------------------------" );

    JSONObject responsejson = (JSONObject) response.getBody().getObject();
    System.out.println( responsejson);

    System.out.println( "---------------------------------------------" );

    Map<String, Object> map;
    map = (HashMap<String, Object>) new ObjectMapper().readValue(responsejson.toString(), LinkedHashMap.class);
    System.out.println(map.get("results"));

    System.out.println( "---------------------------------------------" );

    List<Map<String, Object>> results = (List<Map<String, Object>>)map.get("results");
    System.out.println( results.get(0).get("id") );
    System.out.println( results.get(0).get("senses") );
    List<Map<String, Object>> results33 = (List<Map<String, Object>>)results.get(0).get("senses");
    System.out.println( results33.get(0).get("definition") );
    System.out.println( results33.get(1).get("definition") );




}