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

如何解析嵌套JSON中的对象数组?附SQLite表设计及TypeToken疑问

解决嵌套JSON解析与SQLite表设计问题

一、嵌套JSON解析方案(Gson及其他方式)

你的问题核心是JSON结构是多层嵌套的,根对象不是直接的数组,而是包含_embedded->episodes的层级,所以直接用TypeToken<List<Episode>>解析会失败。这里给你两种可行方案:

方案1:创建对应层级的实体类(Gson推荐方式)

先定义匹配JSON结构的Java类:

// 根对象类
public class RootResponse {
    @SerializedName("_embedded")
    private Embedded embedded;

    // getters & setters
    public Embedded getEmbedded() { return embedded; }
    public void setEmbedded(Embedded embedded) { this.embedded = embedded; }
}

// Embedded类
public class Embedded {
    private List<Episode> episodes;

    // getters & setters
    public List<Episode> getEpisodes() { return episodes; }
    public void setEpisodes(List<Episode> episodes) { this.episodes = episodes; }
}

// 你的Episode类(假设已有)
public class Episode {
    private String name; // 对应JSON里的name
    private String summary; // 对应JSON里的summary
    // 其他字段、getters & setters
}

然后修改解析代码:

private void insertToSQLite(SQLiteDatabase db) {
    Gson gson = new Gson();
    // 先解析根对象
    RootResponse root = gson.fromJson(output, RootResponse.class);
    // 获取episodes列表
    List<Episode> episodesList = root.getEmbedded().getEpisodes();
    
    // 后续插入SQLite的逻辑不变
    for(Episode episode : episodesList) {
        ContentValues insertValues = new ContentValues();
        insertValues.put(Episode.TITLE, episode.getName()); // 注意对应字段名
        insertValues.put(Episode.SUMMARY, episode.getSummary());
        // ...其他字段
        db.insert(Episode.TABLE_NAME, null, insertValues);
    }
}

方案2:直接用JsonObject解析(无需额外实体类)

如果不想创建多余的类,可以用Gson的JsonObject API直接提取数组:

private void insertToSQLite(SQLiteDatabase db) {
    Gson gson = new Gson();
    JsonObject rootObj = gson.fromJson(output, JsonObject.class);
    // 逐层获取嵌套的episodes数组
    JsonObject embeddedObj = rootObj.getAsJsonObject("_embedded");
    JsonArray episodesArray = embeddedObj.getAsJsonArray("episodes");
    
    // 遍历数组转成Episode对象
    for (JsonElement element : episodesArray) {
        Episode episode = gson.fromJson(element, Episode.class);
        ContentValues insertValues = new ContentValues();
        insertValues.put(Episode.TITLE, episode.getName());
        insertValues.put(Episode.SUMMARY, episode.getSummary());
        // ...其他字段
        db.insert(Episode.TABLE_NAME, null, insertValues);
    }
}

其他可选解析库

除了Gson,你也可以用Android自带的org.json包(无需额外依赖),或者更轻量的Moshi、Jackson,核心思路都是逐层解析嵌套结构,找到目标数组后再转换为实体对象。


二、SQLite表设计建议

从你给出的JSON结构来看,只需要一张Episode表就足够了,原因如下:

  • 当前的episodes数组里的每个对象都是扁平结构(只有name、summary等简单字段),没有嵌套的子对象或子数组;
  • 只有当你的JSON里出现嵌套的集合类型(比如每个episode里有comments数组、characters数组),或者多对一/一对多的关联关系时,才需要拆分多张表,通过外键建立关联。

举个例子,如果以后每个episode有多个评论,那你需要建两张表:

  • episode表:存储episode的基础信息(id、name、summary等)
  • comment表:存储评论内容,加一个episode_id外键关联到对应的episode

三、优秀的嵌套JSON解析与SQLite设计教程推荐

  1. Gson官方指南:重点关注「嵌套对象解析」「集合类型解析」章节,里面有详细的注解使用(比如@SerializedName)和TypeToken的正确用法说明;
  2. Android官方SQLite教程:讲解数据库设计的基本原则,包括实体关系、外键使用、表拆分的场景;
  3. 《Android编程权威指南》:书中有专门的章节讲解JSON解析(包括嵌套结构)和SQLite数据库设计,适合入门到进阶学习;
  4. 《Effective Android》:里面提到了高效解析复杂JSON的技巧,以及移动端数据库设计的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:43:52