You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何解析以日期为键的JSON数据

嘿,这种以动态日期作为键的JSON解析需求,在Android开发里其实挺常见的,我之前做项目也碰到过,给你分享几个实用的解决方案:

方法一:用Gson结合Map解析(最推荐)

这种方式代码简洁,容错性强,适合大多数场景。核心思路是用Map<String, List<实体类>>来接收data字段里的动态日期键和对应的数据列表。

首先定义对应的数据实体类:

// 对应JSON数组里的每一条详情数据
public class ReservationDetail {
    @SerializedName("detail_id")
    private int detailId;
    @SerializedName("reservation_id")
    private int reservationId;
    @SerializedName("field_id")
    private int fieldId;
    private int total;
    // 其他字段根据实际需求添加
    // 别忘了生成getter、setter方法,或者用Lombok注解简化代码
}

// 整个API响应的实体类
public class ReservationResponse {
    private Map<String, List<ReservationDetail>> data;
    private Links links; // 如果需要解析links字段,同样定义对应的Links类即可
    // getter、setter方法
}

然后用Gson完成解析:

// 假设jsonString是你从API获取到的JSON字符串
String jsonString = "你的API返回JSON";
Gson gson = new Gson();
ReservationResponse response = gson.fromJson(jsonString, ReservationResponse.class);

// 遍历所有日期和对应的详情列表
for (Map.Entry<String, List<ReservationDetail>> entry : response.getData().entrySet()) {
    String date = entry.getKey(); // 获取日期字符串,比如"10/05/2018"
    List<ReservationDetail> detailList = entry.getValue(); // 该日期下的所有预约详情
    
    // 这里可以根据业务需求处理数据,比如打印日志或者更新UI
    Log.d("解析结果", String.format("日期:%s,共%d条记录", date, detailList.size()));
}
方法二:手动用JSONObject解析(无需第三方库)

如果你的项目里没有引入Gson这类第三方解析库,也可以用Android自带的JSONObject手动解析,就是代码会稍微繁琐一点:

try {
    JSONObject rootJson = new JSONObject(jsonString);
    JSONObject dataJson = rootJson.getJSONObject("data");
    
    // 获取所有日期键的迭代器
    Iterator<String> dateKeyIterator = dataJson.keys();
    while (dateKeyIterator.hasNext()) {
        String date = dateKeyIterator.next();
        JSONArray detailArray = dataJson.getJSONArray(date);
        
        // 遍历当前日期下的所有详情数据
        for (int i = 0; i < detailArray.length(); i++) {
            JSONObject detailJson = detailArray.getJSONObject(i);
            int detailId = detailJson.getInt("detail_id");
            int reservationId = detailJson.getInt("reservation_id");
            int fieldId = detailJson.getInt("field_id");
            int total = detailJson.getInt("total");
            // 其他字段按照同样的方式解析
            
            // 可以把解析出来的数据封装到ReservationDetail对象中,方便后续处理
        }
    }
    
    // 如果需要解析links字段,同样通过rootJson.getJSONObject("links")处理
} catch (JSONException e) {
    e.printStackTrace();
    // 这里记得处理解析异常,比如给用户提示解析失败
}
方法三:Retrofit配合Gson(网络请求场景)

如果是通过Retrofit发起网络请求获取这个API数据,只需要把接口的返回类型定义成我们之前写的ReservationResponse即可:

public interface ReservationApiService {
    @GET("你的API接口路径")
    Call<ReservationResponse> getReservationData();
}

调用接口时,解析逻辑和方法一完全一致:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("你的API基础地址")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

ReservationApiService apiService = retrofit.create(ReservationApiService.class);
Call<ReservationResponse> call = apiService.getReservationData();
call.enqueue(new Callback<ReservationResponse>() {
    @Override
    public void onResponse(Call<ReservationResponse> call, Response<ReservationResponse> response) {
        if (response.isSuccessful() && response.body() != null) {
            Map<String, List<ReservationDetail>> dataMap = response.body().getData();
            // 这里处理数据即可
        }
    }

    @Override
    public void onFailure(Call<ReservationResponse> call, Throwable t) {
        // 处理请求失败的情况
    }
});

总的来说,Gson+Map的方式是最省心高效的,推荐优先使用;如果项目限制不能用第三方库,手动解析也完全能满足需求。

内容的提问来源于stack exchange,提问作者Kenny Horna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:09:24