gson 如何高效解析每次都会演变的Rest Api响应

cnh2zyt3  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(166)

我不是一个程序员,所以我缺乏基本知识。
我想创建一个桌面应用程序,一个字典,你搜索一个词,你有一个简短的定义。
我利用他们。
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);

}

ncgqoxb0

ncgqoxb01#

最简单的方法是将json解析(反序列化)为java Map<String, Object>,使用您喜欢的库(尝试Jackson或gson)总是成功的(值本身可能是Map)。
然后检查贴图的关键点以确定如何处理它。
更难但更“正确”的方法是反序列化到由有效负载的属性选择的各种类,但在这种情况下我不会,因为API设计听起来有点古怪。
下面是一些将json解析为map的代码:

import com.fasterxml.jackson.databind.ObjectMapper;

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

为了更容易地访问Map值,您可能会发现此helper方法可以方便地执行推理转换:

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
ct3nt3jp

ct3nt3jp2#

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") );

}

相关问题