如何用Java解析网站JSON?含指定API的下载与直接解析方法
Hey there! 你这个需求在Java开发里挺常见的,我给你分两种场景来详细说明:一种是直接从API接口实时解析JSON数据,另一种是先把JSON内容保存到本地文件,之后再读取解析。咱们一步步来~
一、直接从网络解析JSON数据
我推荐使用Jackson这个流行的JSON处理库,它能轻松把JSON字符串映射成Java对象,非常省心。
1. 添加Jackson依赖
如果你用Maven,在pom.xml里加入以下依赖(用最新稳定版即可):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
如果你用Gradle,就在build.gradle里加:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
2. 编写实体类映射JSON结构
先看一下目标API返回的JSON格式:
{"status":true,"data":0.0}
我们需要创建一个Java类来对应这个结构,字段名要和JSON的key对应(或者用@JsonProperty注解指定):
import com.fasterxml.jackson.annotation.JsonProperty; public class NanopoolBalanceResponse { private boolean status; @JsonProperty("data") // 这里可以省略,因为字段名和JSON key一致,仅作注解用法演示 private double balance; // Getter和Setter方法 public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }
3. 编写解析代码
用Java 11+自带的HttpClient发送请求,再用Jackson的ObjectMapper解析响应:
import com.fasterxml.jackson.databind.ObjectMapper; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class DirectJsonParser { public static void main(String[] args) { String apiUrl = "https://api.nanopool.org/v1/etn/balance/etnkGqH26XNVZ9cJv7jh95Dwj7LYPupYX5F5QVf85icHXq2sRJcXSxDT6SL4gD2Vn1WBKi5wqd9x5En2LLmDhnKs8pqrcM75VJ"; // 初始化HttpClient和ObjectMapper HttpClient httpClient = HttpClient.newHttpClient(); ObjectMapper objectMapper = new ObjectMapper(); try { // 构建GET请求 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(apiUrl)) .GET() .build(); // 发送请求并获取响应字符串 HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); // 把JSON字符串映射成Java对象 NanopoolBalanceResponse balanceResponse = objectMapper.readValue(response.body(), NanopoolBalanceResponse.class); // 处理结果 if (balanceResponse.isStatus()) { System.out.println("当前ETN余额: " + balanceResponse.getBalance()); } else { System.out.println("API请求失败"); } } catch (Exception e) { e.printStackTrace(); } } }
二、先保存JSON到本地文件,再解析
如果需要把API返回的JSON持久化到本地,之后再读取解析,可以在上面的代码基础上添加文件读写逻辑:
1. 保存JSON到本地文件
在获取到response.body()之后,用FileWriter把JSON字符串写入文件:
import java.io.FileWriter; import java.io.IOException; // 放在解析代码的try块里,获取response之后 try (FileWriter writer = new FileWriter("nanopool_balance.json")) { writer.write(response.body()); System.out.println("JSON文件已成功保存到本地目录"); } catch (IOException e) { e.printStackTrace(); }
2. 读取本地文件解析
用Jackson的ObjectMapper直接读取本地文件并映射成Java对象:
import java.io.File; // 可以单独写方法,或者放在main方法里 try { NanopoolBalanceResponse savedResponse = objectMapper.readValue(new File("nanopool_balance.json"), NanopoolBalanceResponse.class); System.out.println("从本地文件读取的余额: " + savedResponse.getBalance()); } catch (IOException e) { e.printStackTrace(); }
三、原生方式(不依赖第三方库)
如果你不想引入第三方库,也可以用Java原生的HttpURLConnection获取响应,再结合org.json包(需要单独导入依赖)手动解析JSON节点。这种方式适合简单的JSON结构,复杂场景会比较繁琐:
首先添加org.json依赖(Maven):
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20230618</version> </dependency>
然后编写解析代码:
import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class NativeJsonParser { public static void main(String[] args) { String apiUrl = "https://api.nanopool.org/v1/etn/balance/etnkGqH26XNVZ9cJv7jh95Dwj7LYPupYX5F5QVf85icHXq2sRJcXSxDT6SL4gD2Vn1WBKi5wqd9x5En2LLmDhnKs8pqrcM75VJ"; try { URL url = new URL(apiUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // 读取响应内容 BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); // 手动解析JSON节点 JSONObject jsonObject = new JSONObject(response.toString()); boolean status = jsonObject.getBoolean("status"); double balance = jsonObject.getDouble("data"); if (status) { System.out.println("当前ETN余额: " + balance); } else { System.out.println("请求失败"); } } catch (Exception e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者romainlavisse
相关产品推荐
相关产品推荐

