安卓如何解析JSON数据:从基础到实战全解析
在移动应用开发中,JSON(JavaScript Object Notation)因其轻量级、易读性和跨平台特性,已成为安卓应用与服务器交互最常用的数据交换格式,无论是获取用户信息、加载列表数据,还是接收接口响应,解析JSON都是安卓开发者的必备技能,本文将详细介绍安卓中解析JSON的多种方式,从官方原生库到第三方库,并结合代码实例带你核心技巧。
JSON基础回顾
在解析之前,先简单回顾JSON的数据结构:
- 对象(Object):用 表示,键值对集合,如
{"name":"张三", "age":25}。 - 数组(Array):用
[]表示,有序值列表,如[{"name":"李四"}, {"name":"王五"}]。 - 值(Value):可以是字符串、数字、布尔值、null、对象或数组。
安卓解析JSON的核心目标:将JSON文本转换为安卓可操作的对象(如Java实体类、List等),或将安卓对象转换为JSON文本。
安卓原生解析方案
安卓官方提供了org.json包用于JSON解析,无需额外依赖,适合轻量级场景。
解析JSON为Java对象
org.json包的核心类包括JSONObject(解析JSON对象)、JSONArray(解析JSON数组)和JSONStringer/JSONTokener(构建/解析工具类)。
示例1:解析简单JSON对象
假设服务器返回JSON数据:
{"name":"张三", "age":25, "isStudent":false}
解析为Java实体类User:
// 1. 定义实体类
public class User {
private String name;
private int age;
private boolean isStudent;
// 构造方法、getter/setter省略
}
// 2. 解析JSON
public User parseUser(String jsonStr) throws JSONException {
JSONObject jsonObject = new JSONObject(jsonStr);
User user = new User();
user.setName(jsonObject.getString("name"));
user.setAge(jsonObject.getInt("age"));
user.setStudent(jsonObject.getBoolean("isStudent"));
return user;
}
示例2:解析JSON数组
假设JSON数据为:
[
{"name":"李四", "age":22},
{"name":"王五", "age":23}
]
解析为List<User>:
public List<User> parseUserList(String jsonStr) throws JSONException {
List<User> userList = new ArrayList<>();
JSONArray jsonArray = new JSONArray(jsonStr);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
User user = new User();
user.setName(jsonObject.getString("name"));
user.setAge(jsonObject.getInt("age"));
userList.add(user);
}
return userList;
}
注意事项:
- 使用
optType()方法(如optString()、optInt())可避免字段不存在时抛出异常,返回默认值(如optString("key", "default"))。 - JSON中的键需与实体类字段名一致,否则需手动映射(如
jsonObject.getString("user_name")时,用user.setName(jsonObject.getString("user_name")))。
将Java对象转换为JSON
使用JSONObject的put()方法构建JSON:
public String userToJSON(User user) throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", user.getName());
jsonObject.put("age", user.getAge());
jsonObject.put("isStudent", user.isStudent());
return jsonObject.toString();
}
第三方库解析方案
org.json虽然轻量,但在处理复杂数据结构时(如嵌套对象、自动映射)较为繁琐,第三方库如Gson、Jackson、Moshi能简化开发,提供更强大的功能。
Gson(Google官方推荐)
Gson通过反射自动实现JSON与Java对象的转换,无需手动解析每个字段。
步骤1:添加依赖
在app/build.gradle中:
implementation 'com.google.code.gson:gson:2.10.1'
步骤2:定义实体类(与JSON字段对应)
public class User {
private String name;
private int age;
private boolean isStudent;
// 注意:Gson需要无参构造方法
public User() {}
// getter/setter
}
步骤3:解析JSON
// JSON字符串
String jsonStr = "{\"name\":\"张三\", \"age\":25, \"isStudent\":false}";
// 解析为User对象
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user.getName()); // 输出:张三
// 解析为List<User>
String jsonArrayStr = "[{\"name\":\"李四\", \"age\":22}, {\"name\":\"王五\", \"age\":23}]";
List<User> userList = gson.fromJson(jsonArrayStr, new TypeToken<List<User>>(){}.getType());
高级功能:
- 字段映射:用
@SerializedName注解解决JSON字段与Java字段名不一致问题:public class User { @SerializedName("user_name") private String name; // 其他字段 } - 忽略字段:用
@Expose或@Transient注解排除不需要解析的字段。 - 日期处理:通过
GsonBuilder注册日期格式化器:Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
Jackson(高性能选择)
Jackson是社区广泛使用的JSON库,性能优异,支持流式处理(适合大文件解析)。
步骤1:添加依赖
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
步骤2:解析JSON
ObjectMapper mapper = new ObjectMapper();
// 解析为User对象
User user = mapper.readValue(jsonStr, User.class);
// 解析为List<User>
List<User> userList = mapper.readValue(jsonArrayStr, new TypeReference<List<User>>(){});
特点:
- 支持注解(如
@JsonProperty、@JsonIgnore),功能与Gson类似。 - 提供
JsonParser和JsonGenerator,支持增量解析/生成,内存占用更低。
Moshi(Square出品,轻量且现代化)
Moshi是Square团队开发的JSON库,基于Java注解,支持Kotlin(默认使用@Json注解,避免反射性能损耗)。
步骤1:添加依赖
implementation 'com.squareup.moshi:moshi:1.15.0' // Kotlin支持(可选) kapt 'com.squareup.moshi:moshi-kotlin-codegen:1.15.0'
步骤2:解析JSON
Moshi moshi = new Moshi.Builder().build();
JsonAdapter<User> jsonAdapter = moshi.adapter(User.class);
// 解析为User对象
User user = jsonAdapter.fromJson(jsonStr);
// 解析为List<User>
List<User> userList = moshi.adapter(new TypeToken<List<User>>() {}).fromJson(jsonArrayStr);
特点:
- 对Kotlin友好,支持默认参数、数据类等特性。
- 编译时代码生成(Kotlin中),提升运行时性能。
性能对比与选择建议
| 库名 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
org.json |
无需依赖,轻量级 | 手动解析繁琐,功能有限 | 简单JSON数据、快速原型开发 |
| Gson | 自动映射,注解丰富,官方支持 | 反射性能略低,大文件内存占用高 | 中小型项目、需要快速集成 |
| Jackson | 性能优异,支持流式处理 | 学习成本略高 | 大数据量、高性能需求场景 |
| Moshi | Kotlin友好,编译时代码生成 | Java生态支持较少 | Kotlin项目、现代化安卓开发 |
实战案例:网络请求解析JSON
以Retrofit(网络请求库)+ Gson为例,展示完整解析流程:
添加依赖
// Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 网络权限(AndroidManifest.xml) <uses-permission android:name="android.permission.INTERNET"/>
定义API接口
public interface ApiService {
@GET("users")


还没有评论,来说两句吧...