jsonObject.getJSONObject("Data").getString("Token")这行代码是什么意思
时间: 2023-07-22 11:04:10 浏览: 75
这行代码的意思是从一个 JSON 对象中获取名为 "Data" 的属性值,然后再从该属性值对应的 JSON 对象中获取名为 "Token" 的属性值,并将其作为字符串返回。
具体来说,它使用 JSONObject 类的 getJSONObject() 方法从 jsonObject 对象中获取名为 "Data" 的属性对应的 JSON 对象。然后,使用 getString() 方法从该 JSON 对象中获取名为 "Token" 的属性对应的字符串值,并将其返回。这个代码片段通常用于从一个嵌套的 JSON 数据中提取特定的值,例如从一个 API 响应中获取访问令牌。
相关问题
long start = System.currentTimeMillis(); JSONObject user = getToken(); String token = user.getString("token_type") + " " + user.getString("access_token"); JSONArray jsonArray = new JSONArray(); ExecutorService executorService = Executors.newFixedThreadPool(10); CompletionService<JSONObject> completionService = new ExecutorCompletionService<>(executorService); for (String id : ids) { Callable<JSONObject> callable = () -> { JSONObject json; String param = "id=" + id + "&userId=" + user.get("user_id"); json = JSON.parseObject(HttpUtils.doGet(getPlayUrl, param, token)); log.info("中台返回设备流地址url:{}", json.getJSONObject("data")); return json.getJSONObject("data"); }; completionService.submit(callable); } for (int i = 0; i < ids.size(); i++) { Future<JSONObject> future = completionService.take(); jsonArray.add(future.get()); } executorService.shutdown(); long end = System.currentTimeMillis(); log.info("同步中台2.0耗时:{}", (start - end)); return jsonArray;解释下代码
这段代码是一个 Java 方法,其功能是从中台获取多个设备的流地址,并返回一个包含所有设备流地址的 JSON 数组。具体来说,该方法首先使用 `System.currentTimeMillis()` 方法获取当前时间作为开始时间 `start`,然后调用 `getToken()` 方法获取用户的 token,拼接成请求中需要的格式。接下来,创建了一个空的 JSON 数组 `jsonArray`,以及一个线程池 `executorService` 和一个 `CompletionService` 对象 `completionService`,后者用于获取多个异步任务的返回结果。然后,使用 `for` 循环遍历传入的设备 ID 列表 `ids`,对于每个设备 ID,创建一个 `Callable` 对象并提交到 `completionService` 中,该对象会调用 `HttpUtils.doGet()` 方法向中台发送 GET 请求,获取该设备的流地址,并将结果封装成一个 JSON 对象返回。接下来,使用另一个 `for` 循环,遍历 `ids` 列表的长度次数,每次从 `completionService` 中获取一个已经完成的异步任务的结果,并将结果添加到 `jsonArray` 数组中。最后,关闭线程池 `executorService`,使用 `System.currentTimeMillis()` 方法获取当前时间作为结束时间 `end`,计算并输出同步中台2.0耗时。最后,返回 `jsonArray` 数组。
优化这段代码@PostMapping("/login") @ResponseBody @PassToken public Object login(String username,String password) throws IOException { String url="http://42.177.95.222:9202/platform/yugang/task/getToken"; HttpClient client = HttpClients.createDefault(); //默认post请求 HttpPost post = new HttpPost(url); //拼接多参数 JSONObject json = new JSONObject(); json.put("username", "渔业协会"); json.put("password", "Yuye!@#qwe"); post.addHeader("Content-type", "application/json; charset=utf-8"); post.setHeader("Accept", "application/json"); post.setEntity(new StringEntity(json.toString(), Charset.forName("utf-8"))); HttpResponse httpResponse = client.execute(post); HttpEntity entity = httpResponse.getEntity(); String s = EntityUtils.toString(entity); JSONObject jo = JSONObject.parseObject(s); String token = jo.getJSONObject("data").getString("token"); System.out.println("dsadasdasdsadasd"+token); return verify(token); } public Object verify(String token) throws IOException { String url="http://42.177.95.222:9202/platform/yugang/task/verify"; HttpClient client = HttpClients.createDefault(); //默认post请求 HttpPost post = new HttpPost(url); //拼接多参数 JSONObject json = new JSONObject(); json.put("token",token); post.addHeader("Content-type", "application/json; charset=utf-8"); post.setHeader("Accept", "application/json"); post.setEntity(new StringEntity(json.toString(), Charset.forName("utf-8"))); HttpResponse httpResponse = client.execute(post); HttpEntity entity = httpResponse.getEntity(); String s = EntityUtils.toString(entity); JSONObject jo = JSONObject.parseObject(s); return jo; }
这段代码的优化点有以下几个:
1. 将重复的代码抽取成公共方法,避免代码冗余。
2. 使用连接池管理 HttpClient 的连接,提高连接的复用率和性能。
3. 使用 try-with-resources 语句关闭 HttpClient 和 HttpEntity 对象,避免资源泄漏。
下面是代码优化后的示例:
```
private static final String BASE_URL = "http://42.177.95.222:9202/platform/yugang/task";
private CloseableHttpClient httpClient = HttpClientBuilder.create()
.setMaxConnTotal(200)
.setMaxConnPerRoute(100)
.build();
@PostMapping("/login")
@ResponseBody
@PassToken
public Object login(String username, String password) throws IOException {
String token = getToken();
System.out.println("dsadasdasdsadasd" + token);
return verify(token);
}
private String getToken() throws IOException {
String url = BASE_URL + "/getToken";
HttpPost post = new HttpPost(url);
post.addHeader("Content-type", "application/json; charset=utf-8");
post.setHeader("Accept", "application/json");
JSONObject json = new JSONObject();
json.put("username", "渔业协会");
json.put("password", "Yuye!@#qwe");
post.setEntity(new StringEntity(json.toString(), Charset.forName("utf-8")));
try (CloseableHttpResponse response = httpClient.execute(post)) {
HttpEntity entity = response.getEntity();
if (entity != null) {
String s = EntityUtils.toString(entity);
JSONObject jo = JSONObject.parseObject(s);
return jo.getJSONObject("data").getString("token");
}
return null;
}
}
private JSONObject verify(String token) throws IOException {
String url = BASE_URL + "/verify";
HttpPost post = new HttpPost(url);
post.addHeader("Content-type", "application/json; charset=utf-8");
post.setHeader("Accept", "application/json");
JSONObject json = new JSONObject();
json.put("token", token);
post.setEntity(new StringEntity(json.toString(), Charset.forName("utf-8")));
try (CloseableHttpResponse response = httpClient.execute(post)) {
HttpEntity entity = response.getEntity();
if (entity != null) {
String s = EntityUtils.toString(entity);
return JSONObject.parseObject(s);
}
return null;
}
}
```
在优化后的代码中,我们将 HttpClient 对象的创建和关闭都放在了方法外部,使用连接池管理 HttpClient 的连接,提高连接的复用率和性能。同时,我们也将 getToken 和 verify 方法抽取出来,避免了代码冗余。最后,我们使用了 try-with-resources 语句来关闭 HttpClient 和 HttpEntity 对象,避免了资源泄漏。
阅读全文