如何用Java从REST API提取特定数据(如fdcId、description)
从REST API返回的JSON中提取特定字段(fdcId/description)
你的代码目前只是把API返回的JSON原封不动打印出来,要提取特定字段,得用JSON解析库来处理。Java里常用的有Jackson和Gson,这里用Jackson来演示,它是很多Java项目的标配。
步骤1:添加Jackson依赖
如果用Maven管理项目,在pom.xml里加入这段依赖:
<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 可替换为最新稳定版 --> </dependency> </dependencies>
如果是手动导入jar包,需要下载jackson-core、jackson-databind、jackson-annotations这三个jar文件。
步骤2:创建数据类(POJO)
创建一个简单的类来映射API返回的JSON结构,只保留你需要的字段即可:
public class Food { private int fdcId; private String description; // 必须保留无参构造方法,Jackson依赖它实例化对象 public Food() {} // Getter方法,用于获取字段值 public int getFdcId() { return fdcId; } public String getDescription() { return description; } }
后续如果需要提取更多字段,直接在类中添加对应属性和Getter方法即可。
步骤3:修改原代码解析JSON
把原代码中打印JSON的逻辑替换为Jackson解析逻辑,提取目标字段:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import com.fasterxml.jackson.databind.ObjectMapper; public class Main { public static void main(String[] args) { try { URL url = new URL("https://api.nal.usda.gov/fdc/v1/food/1750339?api_key=DEMO_KEY"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept", "application/json"); if (conn.getResponseCode() != 200) { throw new RuntimeException("请求失败:HTTP错误码 " + conn.getResponseCode()); } // 读取完整的JSON响应字符串 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder jsonBuilder = new StringBuilder(); String line; while ((line = br.readLine()) != null) { jsonBuilder.append(line); } String jsonResponse = jsonBuilder.toString(); br.close(); conn.disconnect(); // 用Jackson将JSON字符串转换为Food对象 ObjectMapper objectMapper = new ObjectMapper(); Food food = objectMapper.readValue(jsonResponse, Food.class); // 提取并打印目标字段 System.out.println("fdcId: " + food.getFdcId()); System.out.println("description: " + food.getDescription()); } catch (Exception e) { System.out.println("请求异常:" + e); } } }
关键说明
ObjectMapper是Jackson的核心类,负责完成JSON字符串到Java对象的转换(反序列化)- 数据类的字段名必须和JSON中的键名完全匹配,比如JSON里的
fdcId对应类中的fdcId;如果字段名不一致,可以用@JsonProperty注解指定映射关系,例如@JsonProperty("fdc_id") private int fdcId; - 如果API返回的是数组结构,可通过
objectMapper.readValue(jsonResponse, Food[].class)或者List<Food> foods = objectMapper.readValue(jsonResponse, new TypeReference<List<Food>>() {});来解析
内容的提问来源于stack exchange,提问作者Quibbs
相关产品推荐
相关产品推荐

