在Android开发中,服务端接口返回的数据大多采用JSON格式,其中嵌套JSON数组与对象的结构十分常见,比如商品列表接口可能包含商品基本信息对象,同时每个商品下又嵌套了规格数组、评价对象等内容。掌握这类结构的解析方法是Android开发的基础技能。

解析前的准备工作
首先在Android Studio项目中不需要额外引入第三方依赖,系统自带的org.json库已经足够处理常规的JSON解析需求。如果是通过网络请求获取JSON数据,需要先确保已经获取到完整的JSON字符串,再进行后续解析操作。
基础JSON结构说明
我们先看一个典型的嵌套JSON示例,这个结构包含外层对象、嵌套的对象和数组:
{
"code": 200,
"msg": "请求成功",
"data": {
"user_id": 1001,
"user_name": "测试用户",
"order_list": [
{
"order_id": "O001",
"order_price": 99.9,
"goods": [
{
"goods_id": "G001",
"goods_name": "测试商品"
}
]
}
]
}
}
逐层解析步骤
1. 解析最外层对象
首先使用JSONObject将JSON字符串转换为对象,再获取外层的字段:
try {
// 假设jsonStr是获取到的完整JSON字符串
JSONObject rootObj = new JSONObject(jsonStr);
int code = rootObj.getInt("code");
String msg = rootObj.getString("msg");
// 判断请求是否成功
if (code == 200) {
// 继续解析data字段
}
} catch (JSONException e) {
e.printStackTrace();
}
2. 解析嵌套的对象
外层的data字段是一个对象,需要通过getJSONObject方法获取:
try {
JSONObject rootObj = new JSONObject(jsonStr);
int code = rootObj.getInt("code");
if (code == 200) {
// 获取data嵌套对象
JSONObject dataObj = rootObj.getJSONObject("data");
int userId = dataObj.getInt("user_id");
String userName = dataObj.getString("user_name");
// 继续解析order_list数组
}
} catch (JSONException e) {
e.printStackTrace();
}
3. 解析嵌套的JSON数组
order_list是数组类型,使用getJSONArray获取后遍历处理:
try {
JSONObject rootObj = new JSONObject(jsonStr);
int code = rootObj.getInt("code");
if (code == 200) {
JSONObject dataObj = rootObj.getJSONObject("data");
int userId = dataObj.getInt("user_id");
String userName = dataObj.getString("user_name");
// 获取订单数组
JSONArray orderArray = dataObj.getJSONArray("order_list");
for (int i = 0; i < orderArray.length(); i++) {
JSONObject orderObj = orderArray.getJSONObject(i);
String orderId = orderObj.getString("order_id");
double orderPrice = orderObj.getDouble("order_price");
// 解析订单下的商品数组
}
}
} catch (JSONException e) {
e.printStackTrace();
}
4. 解析多层嵌套的数组
每个订单下的goods也是数组,继续按照同样的方式遍历即可:
try {
JSONObject rootObj = new JSONObject(jsonStr);
int code = rootObj.getInt("code");
if (code == 200) {
JSONObject dataObj = rootObj.getJSONObject("data");
int userId = dataObj.getInt("user_id");
String userName = dataObj.getString("user_name");
JSONArray orderArray = dataObj.getJSONArray("order_list");
for (int i = 0; i < orderArray.length(); i++) {
JSONObject orderObj = orderArray.getJSONObject(i);
String orderId = orderObj.getString("order_id");
double orderPrice = orderObj.getDouble("order_price");
// 获取商品数组
JSONArray goodsArray = orderObj.getJSONArray("goods");
for (int j = 0; j < goodsArray.length(); j++) {
JSONObject goodsObj = goodsArray.getJSONObject(j);
String goodsId = goodsObj.getString("goods_id");
String goodsName = goodsObj.getString("goods_name");
// 这里可以将解析到的商品数据存储到实体类中
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
常见问题与注意事项
- 解析前一定要判断字段是否存在,避免
JSONException,可以使用has("字段名")方法判断 - 如果字段可能为null,不要直接调用
getString,可以先判断类型或者使用optString方法,空值时返回默认值 - 数组遍历前先判断数组长度,避免索引越界错误
- 如果JSON结构复杂,建议先定义对应的实体类,解析后直接赋值,方便后续使用
完整解析示例
以下是整合了所有步骤的完整代码:
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class JsonParseUtil {
public static void parseNestedJson(String jsonStr) {
try {
JSONObject rootObj = new JSONObject(jsonStr);
// 解析外层字段
int code = rootObj.optInt("code", -1);
String msg = rootObj.optString("msg", "");
if (code != 200) {
return;
}
// 解析data嵌套对象
if (rootObj.has("data")) {
JSONObject dataObj = rootObj.getJSONObject("data");
int userId = dataObj.optInt("user_id", 0);
String userName = dataObj.optString("user_name", "");
// 解析order_list数组
if (dataObj.has("order_list")) {
JSONArray orderArray = dataObj.getJSONArray("order_list");
for (int i = 0; i < orderArray.length(); i++) {
JSONObject orderObj = orderArray.getJSONObject(i);
String orderId = orderObj.optString("order_id", "");
double orderPrice = orderObj.optDouble("order_price", 0.0);
// 解析goods数组
if (orderObj.has("goods")) {
JSONArray goodsArray = orderObj.getJSONArray("goods");
for (int j = 0; j < goodsArray.length(); j++) {
JSONObject goodsObj = goodsArray.getJSONObject(j);
String goodsId = goodsObj.optString("goods_id", "");
String goodsName = goodsObj.optString("goods_name", "");
// 输出解析结果
System.out.println("商品ID:" + goodsId + ",商品名称:" + goodsName);
}
}
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Android_StudioJSON解析嵌套JSONJSONArrayJSONObject修改时间:2026-07-18 09:03:33