Java 访问 URL 并解析 JSON 数据
在 Java 中访问 URL 并获取 JSON 数据是一个常见的任务,以下是几种实现方法:

使用 Java 11+ 的 HttpClient (推荐)
Java 11 引入了现代化的 HttpClient,这是目前推荐的方式:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class JsonUrlReader {
public static void main(String[] args) {
String url = "https://api.example.com/data";
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.GET()
.build();
try {
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
if (response.statusCode() == 200) {
String json = response.body();
System.out.println("JSON response: " + json);
// 这里可以添加JSON解析代码
} else {
System.err.println("Request failed with status: " + response.statusCode());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 HttpURLConnection (传统方式)
适用于所有 Java 版本:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class JsonUrlReaderLegacy {
public static void main(String[] args) {
try {
URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("HTTP error code: " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
response.append(line);
}
br.close();
String json = response.toString();
System.out.println("JSON response: " + json);
// 这里可以添加JSON解析代码
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用第三方库 (如 OkHttp)
添加 OkHttp 依赖到项目中:
<!-- Maven -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
然后使用:
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpJsonReader {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.example.com/data")
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
String json = response.body().string();
System.out.println("JSON response: " + json);
// 这里可以添加JSON解析代码
} catch (Exception e) {
e.printStackTrace();
}
}
}
解析 JSON 数据
获取 JSON 字符串后,可以使用以下库进行解析:
使用 Jackson
import com.fasterxml.jackson.databind.ObjectMapper;
// 在获取JSON字符串后
ObjectMapper mapper = new ObjectMapper();
try {
// 解析为Map
Map<String, Object> map = mapper.readValue(json, Map.class);
System.out.println(map);
// 或者解析为自定义对象
MyDataObject obj = mapper.readValue(json, MyDataObject.class);
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
}
使用 Gson
import com.google.gson.Gson;
// 在获取JSON字符串后
Gson gson = new Gson();
try {
// 解析为Map
Map<String, Object> map = gson.fromJson(json, Map.class);
System.out.println(map);
// 或者解析为自定义对象
MyDataObject obj = gson.fromJson(json, MyDataObject.class);
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
}
注意事项
- 异常处理:网络请求可能会失败,需要妥善处理各种异常
- 超时设置:为网络请求设置合理的超时时间
- 资源释放:确保关闭所有打开的连接和流
- HTTPS:如果使用 HTTPS,确保服务器证书有效或配置信任所有证书(仅用于测试)
- 性能:对于频繁请求,考虑使用连接池
选择哪种方法取决于你的 Java 版本和项目需求,Java 11+ 的 HttpClient 是目前最现代和推荐的方式。
