You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动