Android中JSON数据的解析与生成全攻略
在Android开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读且与语言无关的特性,成为客户端与服务器交互、数据存储的首选,本文将从JSON的生成(将对象转换为JSON字符串)和解析(将JSON字符串转换为对象)两个核心场景出发,结合Android原生库与第三方库,详细讲解JSON的使用方法,并附上完整示例代码。
Android原生JSON处理:JSONObject与JSONArray
Android SDK内置了org.json包,提供了JSONObject和JSONArray两个核心类,无需额外依赖即可完成JSON的基本操作。
(一)JSON生成:将对象/集合转换为JSON字符串
JSON生成是将Java对象、Map或List等数据结构转换为JSON格式字符串的过程,以下通过常见场景举例:
将Java对象转换为JSON字符串
假设有一个User类,包含id、name、age和isAdult字段,需将其转换为JSON字符串(如{"id":1,"name":"张三","age":25,"isAdult":true})。
步骤:
- 创建
JSONObject对象,通过put(key, value)方法逐个添加字段值。 - 注意:
put方法的value支持基本类型(String、int、boolean等)以及JSONObject、JSONArray。
代码示例:
import org.json.JSONObject;
public class JsonGenerator {
public static String generateUserJson() {
JSONObject userJson = new JSONObject();
try {
userJson.put("id", 1);
userJson.put("name", "张三");
userJson.put("age", 25);
userJson.put("isAdult", true);
} catch (Exception e) {
e.printStackTrace();
}
return userJson.toString();
}
}
将List集合转换为JSON数组
若需将List<User>转换为JSON数组(如[{"id":1,"name":"张三"}, {"id":2,"name":"李四"}]),需结合JSONArray。
代码示例:
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class JsonListGenerator {
public static String generateUserListJson() {
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三", 25));
userList.add(new User(2, "李四", 30));
JSONArray jsonArray = new JSONArray();
for (User user : userList) {
JSONObject userJson = new JSONObject();
try {
userJson.put("id", user.getId());
userJson.put("name", user.getName());
jsonArray.put(userJson);
} catch (Exception e) {
e.printStackTrace();
}
}
return jsonArray.toString();
}
}
// User类
class User {
private int id;
private String name;
private int age;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// Getter方法
public int getId() { return id; }
public String getName() { return name; }
public int getAge() { return age; }
}
(二)JSON解析:将JSON字符串转换为对象/集合
JSON解析是将服务器返回的JSON字符串还原为Java对象或集合的过程,需注意处理异常(如JSON格式错误、字段缺失等)。
解析简单JSON字符串为Java对象
假设服务器返回JSON字符串:{"id":1,"name":"张三","age":25,"isAdult":true},需解析为User对象。
步骤:
- 创建
JSONObject对象,传入JSON字符串。 - 通过
getXXX(key)方法获取字段值(如getString("name")、getInt("age"))。 - 将解析出的值填充到Java对象中。
代码示例:
import org.json.JSONObject;
import java.io.IOException;
public class JsonParser {
public static User parseUserJson(String jsonString) {
try {
JSONObject jsonObject = new JSONObject(jsonString);
User user = new User();
user.setId(jsonObject.getInt("id"));
user.setName(jsonObject.getString("name"));
user.setAge(jsonObject.getInt("age"));
user.setAdult(jsonObject.getBoolean("isAdult"));
return user;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
// User类需添加setter方法
class User {
// ...(同上)
public void setId(int id) { this.id = id; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
public void setAdult(boolean adult) { isAdult = adult; }
}
解析JSON数组为List集合
若服务器返回JSON数组:[{"id":1,"name":"张三"},{"id":2,"name":"李四"],需解析为List<User>。
代码示例:
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class JsonListParser {
public static List<User> parseUserListJson(String jsonString) {
List<User> userList = new ArrayList<>();
try {
JSONArray jsonArray = new JSONArray(jsonString);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
User user = new User();
user.setId(jsonObject.getInt("id"));
user.setName(jsonObject.getString("name"));
userList.add(user);
}
} catch (Exception e) {
e.printStackTrace();
}
return userList;
}
}
(三)原生JSON的优缺点
- 优点:无需额外依赖,适合简单场景的JSON处理。
- 缺点:
- 手动映射字段繁琐,代码可读性差;
- 不支持直接将JSON字符串转换为Java对象(需手动填充);
- 处理复杂嵌套JSON时容易出错。
第三方JSON库:Gson与FastJson
对于复杂项目或需要高效处理JSON的场景,推荐使用第三方库(如Google的Gson、阿里的FastJson),它们支持自动映射、泛型集合等高级功能。
(一)Gson:Google官方JSON库
添加依赖
在app/build.gradle中添加:
implementation 'com.google.code.gson:gson:2.10.1'
JSON生成(对象→字符串)
Gson通过Gson对象的toJson()方法直接生成JSON字符串,无需手动构建JSONObject。
代码示例:
import com.google.gson.Gson;
public class GsonGenerator {
public static String generateUserJson() {
User user = new User(1, "张三", 25);
Gson gson = new Gson();
return gson.toJson(user);
}
}
// 输出:{"id":1,"name":"张三","age":25}
JSON解析(字符串→对象)
Gson通过fromJson()方法直接将JSON字符串转换为Java对象,需指定目标类型(如User.class)。
代码示例:
import com.google.gson.Gson;
public class GsonParser {
public static User parseUserJson(String jsonString) {
Gson gson = new Gson();
return gson.fromJson(jsonString, User.class);
}
}
解析嵌套JSON与泛型集合
假设JSON为{"code":200,"data":[{"id":1,"name":"张三"}]},需解析为包含List<User>的响应对象ApiResponse。
定义响应类:
class ApiResponse<T> {
private int code;
private List<T> data;
public int getCode() { return code; }
public List<T> getData() { return data; }
public void setCode(int code) { this.code = code; }
public void setData(List<T> data) { this.data = data; }
}
解析代码:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonComplexParser {
public static ApiResponse<User> parseApiResponse(String jsonString) {
Gson gson = new Gson();
// 使用TypeToken处理泛型类型
Type type = new TypeToken<ApiResponse<User>>() {}.getType();
return gson.fromJson(jsonString, type);
}
}
(二)FastJson:阿里开源JSON库
添加依赖
在app/build.gradle中添加:
implementation 'com.alibaba:fastjson:1.2.83'
JSON生成与解析
FastJson的API与Gson类似,但更简洁,支持直接解析JSON为数组或集合。
代码示例:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.List; public class Fast



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