上一篇
安卓处理服务器json
- 行业动态
- 2025-04-22
- 7
安卓处理服务器JSON数据流程
添加网络权限
在 AndroidManifest.xml
中声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
引入依赖库
推荐使用 Retrofit + Gson 组合(也可选择 OkHttp、Volley 等):
// Retrofit 网络请求库 implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Gson 解析库 implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
定义数据模型类
根据 JSON 结构创建对应的 Java/Kotlin 类,
// 示例 JSON: {"name":"张三","age":25,"email":"zhangsan@example.com"} public class User { private String name; private int age; private String email; // Getter 和 Setter 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } // 其他字段同理... }
创建 Retrofit 接口
定义 API 接口,
public interface ApiService { @GET("user/info") // 对应服务器的 API 路径 Call<User> getUserInfo(); // 返回 User 对象 }
初始化 Retrofit
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/api/") // 替换为实际服务器地址 .addConverterFactory(GsonConverterFactory.create()) // 使用 Gson 解析 JSON .build(); ApiService apiService = retrofit.create(ApiService.class);
发送请求并解析数据
// 异步请求(推荐) apiService.getUserInfo().enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { if (response.isSuccessful()) { User user = response.body(); // 处理数据(如更新 UI) Log.d("UserInfo", "姓名: " + user.getName()); } else { // 处理错误(如服务器返回 404) Log.e("Error", "响应码: " + response.code()); } } @Override public void onFailure(Call<User> call, Throwable t) { // 处理网络错误(如无网络) Log.e("NetworkError", t.getMessage()); } });
常见 JSON 结构处理方式对比
JSON 结构 | 处理方式 |
---|---|
简单对象(如 {"key":value} ) |
直接映射到 Java 对象的字段 |
数组(如 [{"id":1}, {"id":2}] ) |
定义为 List<Item> 或 ArrayList<Item> |
嵌套对象(如 {"user":{"name":"张三"}} ) |
创建嵌套类(如 User 类包含 UserInfo user 字段) |
动态字段(如 {"data":{...}} ) |
使用 JsonObject 或自定义 Deserializer |
错误处理与优化建议
问题类型 | 解决方案 |
---|---|
网络错误(如超时、DNS 失败) | 使用 onFailure 回调捕获异常,提示用户检查网络 |
JSON 格式错误 | 在 onResponse 中检查 response.body() 是否为 null |
字段缺失或类型不匹配 | 在数据模型类中使用 transient 忽略无关字段,或自定义 Gson 解析规则 |
主线程阻塞 | 避免使用 execute() ,始终使用 enqueue() 进行异步请求 |
相关问题与解答
问题1:如何处理嵌套 JSON 或复杂结构?
解答:
定义嵌套类,
public class ResponseWrapper<T> { private T data; private String message; // Getter/Setter... } // 使用时:Call<ResponseWrapper<User>> call = apiService.getUserData();
或使用
Map<String, Object>
接收动态结构,再手动提取字段。
问题2:如何将 JSON 数据保存到本地数据库?
解答:
解析 JSON 后,将数据转换为实体类对象。
使用 Room 持久化库将数据插入数据库:
@Entity public class UserEntity { @PrimaryKey(autoGenerate = true) public int id; public String name; // 其他字段... } // 插入数据 userDao.insert(user); // 需通过 Repository 模式调用 DAO 接口