当前位置:首页 > 行业动态 > 正文

安卓从服务器获取json

安卓获取JSON需配置网络权限,使用HttpURLConnection/OkHttp发起请求,读取输入流并解析为 JSONObject/JSONArray,注意处理异常及异步操作防止主线程阻塞

安卓从服务器获取JSON数据详解

前置准备

  1. 添加网络权限
    AndroidManifest.xml 中声明网络权限:

    <uses-permission android:name="android.permission.INTERNET" />
  2. 选择网络库

    • 原生方式HttpURLConnection(需手动处理线程和异常)
    • 第三方库OkHttp(轻量级)、Retrofit(封装更完善)

使用 OkHttp 获取 JSON 数据

添加依赖

build.gradle 中添加 OkHttp 依赖:

implementation 'com.squareup.okhttp3:okhttp:4.10.0'

创建异步任务

// 示例:从 https://api.example.com/data 获取 JSON
new Thread(() -> {
    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()) {
            String json = response.body().string();
            // 解析 JSON(见下文)
        } else {
            // 处理错误码(如 404、500)
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

解析 JSON 数据

使用 Gson 库

  • 添加依赖

    implementation 'com.google.code.gson:gson:2.10'
  • 定义数据模型类

    // 假设 JSON 格式为:{"name":"张三","age":25}
    public class User {
        private String name;
        private int age;
        // Getter 和 Setter 方法
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public int getAge() { return age; }
        public void setAge(int age) { this.age = age; }
    }
  • 解析 JSON

    Gson gson = new Gson();
    User user = gson.fromJson(json, User.class); // json 是上一步获取的字符串

完整流程(带 UI 更新)

// 在 Activity 中执行
new Thread(() -> {
    try {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url("https://api.example.com/data").build();
        Response response = client.newCall(request).execute();
        String json = response.body().string();
        // 切换到主线程更新 UI
        runOnUiThread(() -> {
            User user = gson.fromJson(json, User.class);
            textView.setText("姓名:" + user.getName() + ",年龄:" + user.getAge());
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

常见问题与解决方案

问题 解决方案
网络请求阻塞主线程 使用子线程(如 new Thread)或异步框架(如 Retrofit + RxJava)
JSON 解析失败 检查 JSON 格式是否与模型类匹配,或使用 TypeToken 处理复杂结构(如泛型)
HTTPS 证书错误 在 OkHttpClient 中配置信任所有证书(仅限测试环境)

相关问题与解答

问题 1:如何信任所有 HTTPS 证书(测试用途)?

解答
在 OkHttpClient 中配置 SSLSocketFactory

OkHttpClient client = new OkHttpClient.Builder()
    .sslSocketFactory(new TrustManagerFactory().trustAllCerts(), new X509TrustManager() {
        @Override public void checkClientTrusted(X509Certificate[] chain, String authType) {}
        @Override public void checkServerTrusted(X509Certificate[] chain, String authType) {}
        @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
    })
    .hostnameVerifier((hostname, session) -> true) // 禁用主机名验证
    .build();

注意:此方法仅用于测试,生产环境需正确校验证书。


问题 2:Retrofit 如何配置缓存?

解答
在 OkHttpClient 中添加缓存配置,并传入 Retrofit:

// 设置缓存目录和大小(10MB)
Cache cache = new Cache(new File(context.getCacheDir(), "http_cache"), 10  1024  1024);
OkHttpClient client = new OkHttpClient.Builder()
    .cache(cache) // 启用缓存
    .build();
Retrofit retrofit = new Retrofit.Builder()
    .client(client)
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

说明:Retrofit 会自动处理缓存逻辑,需在服务器响应头中配置 Cache-Control

0