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
相关产品推荐
相关产品推荐

