安卓JSON解析全攻略:从入门到精通
在安卓开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读、易解析的特点,成为客户端与服务器交互的主流数据格式,无论是获取用户信息、加载列表数据,还是接收接口返回的复杂嵌套数据,都离不开JSON解析,本文将详细介绍安卓中JSON解析的多种方式,从官方原生方案到第三方库,辅以代码示例和场景解析,帮你彻底安卓JSON解析技巧。
JSON基础:在解析前先搞懂“数据结构”
JSON本质是一种键值对(Key-Value)的文本格式,支持两种核心结构:
对象(Object)
用 表示,无序的键值对集合,键(Key)必须是字符串,值(Value)可以是任意类型(字符串、数字、布尔值、数组、对象等)。
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "朝阳区"
}
}
数组(Array)
用 [] 表示,有序的值列表,值可以是任意JSON类型。
[
{"id": 1, "name": "商品A"},
{"id": 2, "name": "商品B"}
]
理解了JSON的数据结构,接下来就能针对性地选择解析方式。
安卓原生JSON解析:无需依赖,官方直接支持
安卓系统提供了内置的JSON解析API,核心是 org.json 包(无需额外导入,属于Android SDK),虽然功能不如第三方库强大,但对于简单数据场景完全够用,且无需引入第三方依赖,适合小型项目或对依赖敏感的场景。
解析JSON对象(JSONObject)
假设服务器返回一个用户信息的JSON对象:
{"name":"李四","age":30,"email":"lisi@example.com"}
解析步骤:
- 获取
JSONObject实例(从字符串或网络响应中) - 通过
getString()、getInt()、getBoolean()等方法根据键取值
import org.json.JSONObject;
public class User {
private String name;
private int age;
private String email;
// 从JSON字符串解析User对象
public static User parseFromJson(String jsonString) throws Exception {
JSONObject jsonObject = new JSONObject(jsonString);
User user = new User();
user.name = jsonObject.getString("name");
user.age = jsonObject.getInt("age");
user.email = jsonObject.getString("email");
return user;
}
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + ", email='" + email + "'}";
}
}
// 使用示例
String jsonString = "{\"name\":\"李四\",\"age\":30,\"email\":\"lisi@example.com\"}";
try {
User user = User.parseFromJson(jsonString);
Log.d("User", user.toString()); // 输出: User{name='李四', age=30, email='lisi@example.com'}
} catch (Exception e) {
e.printStackTrace();
}
解析JSON数组(JSONArray)
假设服务器返回一个商品列表的JSON数组:
[
{"id": 1, "name":"商品A","price":19.9},
{"id": 2, "name":"商品B","price":29.9}
]
解析步骤:
- 获取
JSONArray实例 - 遍历数组,逐个解析每个元素(JSONObject)
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class Product {
private int id;
private String name;
private double price;
public static Product parseFromJson(JSONObject jsonObject) throws Exception {
Product product = new Product();
product.id = jsonObject.getInt("id");
product.name = jsonObject.getString("name");
product.price = jsonObject.getDouble("price");
return product;
}
@Override
public String toString() {
return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
}
// 解析JSON数组为商品列表
public static List<Product> parseListFromJson(String jsonString) throws Exception {
JSONArray jsonArray = new JSONArray(jsonString);
List<Product> productList = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
productList.add(parseFromJson(jsonObject));
}
return productList;
}
// 使用示例
String jsonArrayString = "[{\"id\":1,\"name\":\"商品A\",\"price\":19.9},{\"id\":2,\"name\":\"商品B\",\"price\":29.9}]";
try {
List<Product> products = Product.parseListFromJson(jsonArrayString);
for (Product product : products) {
Log.d("Product", product.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
处理嵌套JSON和复杂类型
对于嵌套JSON(如对象中包含对象或数组),只需逐层解析即可,例如开头的嵌套JSON示例:
String nestedJson = "{\"name\":\"张三\",\"age\":25,\"isStudent\":false,\"courses\":[\"数学\",\"英语\"],\"address\":{\"city\":\"北京\",\"district\":\"朝阳区\"}}";
try {
JSONObject jsonObject = new JSONObject(nestedJson);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean isStudent = jsonObject.getBoolean("isStudent");
// 解析数组
JSONArray coursesArray = jsonObject.getJSONArray("courses");
List<String> courses = new ArrayList<>();
for (int i = 0; i < coursesArray.length(); i++) {
courses.add(coursesArray.getString(i));
}
// 解析嵌套对象
JSONObject addressObject = jsonObject.getJSONObject("address");
String city = addressObject.getString("city");
String district = addressObject.getString("district");
Log.d("NestedData", "姓名: " + name + ", 城市: " + city + ", 课程: " + courses);
} catch (Exception e) {
e.printStackTrace();
}
原生JSON解析的注意事项
- 异常处理:所有解析方法(如
getString()、getInt())都可能抛出JSONException,需用try-catch包裹。 - 键不存在时的处理:直接调用
getString("key")若键不存在会抛异常,可通过has("key")判断是否存在,或使用optString("key", defaultValue)(键不存在时返回默认值,不抛异常)。String name = jsonObject.optString("name", "未知姓名"); // 若"name"不存在,返回"未知姓名" - 数据类型匹配:若JSON中数字类型与解析方法不匹配(如JSON中是字符串"25",用
getInt()解析),会抛异常,需确保类型一致,或先用getString()转换后再手动解析。
第三方JSON解析库:更高效、更易用的选择
当数据结构复杂(如多层嵌套、动态字段)或追求开发效率时,原生 org.json 会显得繁琐,第三方库是更好的选择,主流库包括 Gson(Google)、Moshi(Square)、FastJSON(阿里)。
Gson:官方推荐,功能强大
Gson是Google开源的JSON库,支持将Java对象序列化为JSON字符串,也可将JSON字符串反序列化为Java对象,支持复杂类型、泛型、注解等。
(1)添加依赖(Android Studio)
在 app/build.gradle 中添加:
implementation 'com.google.code.gson:gson:2.10.1' // 建议使用最新版本
(2)基本使用:对象与JSON互转
定义实体类(字段名需与JSON键名一致,或通过注解映射):
public class User {
private String name;
private int age;
private String email;
// 必须提供无参构造方法(Gson反射需要)
public User() {}
// 可选:getter/setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// 其他getter/setter...
}
JSON字符串转对象:
String jsonString = "{\"name\":\"王五\",\"age\":28,\"email\":\"wangwu@example.com\"}";
Gson gson = new Gson();
User user = gson.fromJson(jsonString, User.class);
Log.d("GsonUser", user.getName()); // 输出: 王五
对象转JSON字符串:
User user = new User();
user.setName("王五");
user.setAge(28);
user.setEmail("wangwu@example.com");
String json = gson.toJson(user);


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