如何在Java中从API响应提取address1信息?
提取JSON响应中
address1字段的解决思路 针对你需要从API返回的JSON中提取address1的需求,以下是几种适合Java新手的实用方案:
方案1:使用Java原生JSON工具(JDK 11+)
JDK 11及以上版本自带了JSON解析API,无需额外引入依赖,适合快速验证:
import javax.json.Json; import javax.json.JsonObject; import java.io.StringReader; public class NativeJsonParse { public static void main(String[] args) { String apiResponse = "{\"data\":{\"52WeekChange\":-0.23800159,\"SandP52WeekChange\":-0.0445475,\"address1\":\"Salesforce Tower\"}}"; // 解析JSON字符串为JsonObject JsonObject rootObj = Json.createReader(new StringReader(apiResponse)).readObject(); // 逐层获取嵌套字段 String address1 = rootObj.getJsonObject("data").getString("address1"); System.out.println(address1); // 输出:Salesforce Tower } }
方案2:使用Gson库(Google出品,上手简单)
Gson是Google开源的轻量JSON库,语法简洁,适合新手快速上手。首先需要在项目中引入Gson依赖(Maven/Gradle均可),然后用两种方式解析:
方式A:直接解析JSON节点
import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class GsonNodeParse { public static void main(String[] args) { String apiResponse = "{\"data\":{\"52WeekChange\":-0.23800159,\"SandP52WeekChange\":-0.0445475,\"address1\":\"Salesforce Tower\"}}"; JsonObject rootNode = JsonParser.parseString(apiResponse).getAsJsonObject(); String address1 = rootNode.getAsJsonObject("data").get("address1").getAsString(); System.out.println(address1); } }
方式B:实体类映射(更优雅,适合复杂JSON)
如果后续需要提取更多字段,定义实体类映射整个JSON结构会更易维护,注意用@SerializedName处理特殊字段名(比如以数字开头的52WeekChange):
import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; // 映射API响应的实体类 class ApiResponse { private Data data; public Data getData() { return data; } // 嵌套的data对象实体类 public static class Data { @SerializedName("52WeekChange") // 映射JSON中的特殊字段名 private double weekChange52; private double SandP52WeekChange; private String address1; public String getAddress1() { return address1; } } } public class GsonEntityParse { public static void main(String[] args) { String apiResponse = "{\"data\":{\"52WeekChange\":-0.23800159,\"SandP52WeekChange\":-0.0445475,\"address1\":\"Salesforce Tower\"}}"; ApiResponse response = new Gson().fromJson(apiResponse, ApiResponse.class); String address1 = response.getData().getAddress1(); System.out.println(address1); } }
方案3:使用Jackson库(Spring生态主流选择)
Jackson是Java生态中应用最广泛的JSON库,Spring框架默认使用它。同样先引入依赖,然后解析:
方式A:直接解析JSON节点
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonNodeParse { public static void main(String[] args) throws Exception { String apiResponse = "{\"data\":{\"52WeekChange\":-0.23800159,\"SandP52WeekChange\":-0.0445475,\"address1\":\"Salesforce Tower\"}}"; ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(apiResponse); // path()方法会自动处理字段不存在的情况,避免空指针 String address1 = rootNode.path("data").path("address1").asText(); System.out.println(address1); } }
方式B:实体类映射
用@JsonProperty注解处理特殊字段名,逻辑和Gson类似:
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; class ApiResponseJackson { private DataJackson data; public DataJackson getData() { return data; } public static class DataJackson { @JsonProperty("52WeekChange") private double weekChange52; private double SandP52WeekChange; private String address1; public String getAddress1() { return address1; } } } public class JacksonEntityParse { public static void main(String[] args) throws Exception { String apiResponse = "{\"data\":{\"52WeekChange\":-0.23800159,\"SandP52WeekChange\":-0.0445475,\"address1\":\"Salesforce Tower\"}}"; ApiResponseJackson response = new ObjectMapper().readValue(apiResponse, ApiResponseJackson.class); String address1 = response.getData().getAddress1(); System.out.println(address1); } }
关键注意事项
- 确保API返回的是合法完整的JSON,如果你的响应中有
.....省略部分,要保证最终拿到的JSON结构闭合且格式正确,否则解析会抛出异常。 - 对于JSON中特殊命名的字段(比如数字开头、含特殊字符),必须用注解映射到合法的Java变量名。
- 新手优先推荐Gson,语法更简洁;如果后续会接触Spring框架,提前熟悉Jackson会更有帮助。
内容的提问来源于stack exchange,提问作者AndyInDaHouse
相关产品推荐
相关产品推荐

