如何用Java打印JSON中指定键的值?附OKHttp API请求代码
解决Java提取JSON指定值的两个需求
没问题,我来一步步帮你搞定这两个需求——不管是处理OKHttp的API响应,还是读取本地JSON文件提取指定值,都可以用常用的JSON解析库来实现,下面分别给你演示:
一、处理OKHttp API响应,提取"firstname"值
你的请求代码已经拿到了响应,接下来只需要读取响应体并解析JSON就能拿到目标值。这里推荐两种常用的解析库:Jackson和Gson,你可以选自己顺手的。
方法1:用Jackson解析
首先需要在你的项目里添加Jackson的依赖(如果是Maven项目,在pom.xml里加):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 可以用最新稳定版 --> </dependency>
然后修改你的main方法,加入解析逻辑:
public static void main(String[] args) throws IOException { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api-football-v1.p.rapidapi.com/v2/players/player/874") .get() .addHeader("x-rapidapi-host", "api-football-v1.p.rapidapi.com") .addHeader("x-rapidapi-key", "6147bd5da4mshfacf56a7067aa5ep1ff9e6jsn60984dedb281") .build(); // 用try-with-resources自动关闭响应,避免资源泄漏 try (okhttp3.Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("请求失败,状态码: " + response.code()); } // 获取响应体的JSON字符串 String jsonResponse = response.body().string(); // 初始化Jackson的ObjectMapper ObjectMapper objectMapper = new ObjectMapper(); // 把JSON字符串转成JsonNode,方便动态遍历 JsonNode rootNode = objectMapper.readTree(jsonResponse); // 根据API的实际结构找"firstname"——这个API的响应里,数据在response数组的第一个元素里 JsonNode firstnameNode = rootNode.path("response").path(0).path("firstname"); if (firstnameNode.isTextual()) { System.out.println("球员的名字: " + firstnameNode.asText()); } else { System.out.println("未找到\"firstname\"字段"); } } }
方法2:用Gson解析
同样先加Gson的Maven依赖:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <!-- 最新稳定版即可 --> </dependency>
然后替换解析部分的代码:
// 在try块里替换Jackson的解析逻辑 String jsonResponse = response.body().string(); Gson gson = new Gson(); // 转成JsonObject JsonObject rootObj = gson.fromJson(jsonResponse, JsonObject.class); // 拿到response数组,取第一个元素 JsonArray responseArray = rootObj.getAsJsonArray("response"); if (responseArray.size() > 0) { JsonObject playerObj = responseArray.get(0).getAsJsonObject(); String firstname = playerObj.get("firstname").getAsString(); System.out.println("球员的名字: " + firstname); } else { System.out.println("未找到球员数据"); }
二、读取本地JSON文件并打印指定值
和API响应的解析逻辑差不多,只是把数据源换成本地文件,同样用Jackson或Gson:
用Jackson读取本地JSON文件
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import java.io.File; import java.io.IOException; public class JsonFileProcessor { public static void main(String[] args) throws IOException { // 替换成你的JSON文件路径 File jsonFile = new File("C:/your-path/your-file.json"); ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonFile); // 根据你的JSON结构调整路径,比如如果firstname在user对象里,就用rootNode.path("user").path("firstname") JsonNode targetValue = rootNode.path("firstname"); if (targetValue.isTextual()) { System.out.println("指定值: " + targetValue.asText()); } else { System.out.println("未找到目标字段"); } } }
用Gson读取本地JSON文件
import com.google.gson.Gson; import com.google.gson.JsonObject; import java.io.FileReader; import java.io.IOException; public class JsonFileProcessor { public static void main(String[] args) throws IOException { // 替换成你的JSON文件路径 FileReader fileReader = new FileReader("C:/your-path/your-file.json"); Gson gson = new Gson(); JsonObject rootObj = gson.fromJson(fileReader, JsonObject.class); // 根据文件结构获取值,比如嵌套结构就用getAsJsonObject("parentKey") String targetValue = rootObj.get("firstname").getAsString(); System.out.println("指定值: " + targetValue); fileReader.close(); } }
小提示
- 不管是API响应还是本地文件,一定要对应JSON的实际结构调整字段路径,不然会找不到值哦;
- 处理的时候最好加一些空值判断,避免出现
NullPointerException; - 如果JSON结构固定,也可以创建对应的Java实体类来映射,解析起来更方便。
内容的提问来源于stack exchange,提问作者Bernardo De Pietro




