如何有效地解析每次进化的 Rest Api 响应
How to parse efficiently a Rest Api response that evolve each time
我不是程序员,所以基础知识浅薄
我想创建一个桌面应用程序,一本字典,你搜索一个词,你有一个简短的定义。
我用那些家伙。
下面是我的脚本的一部分。
我的问题是,对于我搜索的每个部分,单词的含义、性质等
我必须制作这个解封装代码行。
// 编辑:解封装=反序列化
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") );
}
我不是程序员,所以基础知识浅薄
我想创建一个桌面应用程序,一本字典,你搜索一个词,你有一个简短的定义。
我用那些家伙。
下面是我的脚本的一部分。
我的问题是,对于我搜索的每个部分,单词的含义、性质等
我必须制作这个解封装代码行。 // 编辑:解封装=反序列化
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") );
}