杰瑞科技汇

Java如何访问URL获取JSON数据?

Java 访问 URL 并解析 JSON 数据

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

Java如何访问URL获取JSON数据?-图1
(图片来源网络,侵删)

使用 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();
}

注意事项

  1. 异常处理:网络请求可能会失败,需要妥善处理各种异常
  2. 超时设置:为网络请求设置合理的超时时间
  3. 资源释放:确保关闭所有打开的连接和流
  4. HTTPS:如果使用 HTTPS,确保服务器证书有效或配置信任所有证书(仅用于测试)
  5. 性能:对于频繁请求,考虑使用连接池

选择哪种方法取决于你的 Java 版本和项目需求,Java 11+ 的 HttpClient 是目前最现代和推荐的方式。

分享:
扫描分享到社交APP
上一篇
下一篇