如何使用Gson从嵌套JSON中提取字段生成可按索引访问的对象列表?
具体实现方案
步骤1:修正原有实体类结构
你现有的Bean类中,Data作为内部类需要添加static修饰,否则Gson解析会触发实例化失败异常,修正后代码如下:
public class Bean{ private List<Data> data; public List<Data> getData() { return data; } public static class Data { private List<String> urls; private String name; private String type; private String picture; public List<String> getUrls() { return urls; } public String getName() { return name; } public String getType() { return type; } public String getPicture() { return picture; } } }
步骤2:定义自定义存储实体类
新建只包含你需要的name和urls字段的实体类,用于存储提取后的结果:
public class SiteItem { private String name; private List<String> urls; // 全参构造方法,方便快速创建对象 public SiteItem(String name, List<String> urls) { this.name = name; this.urls = urls; } // 提供getter方法方便后续读取字段 public String getName() { return name; } public List<String> getUrls() { return urls; } }
步骤3:完善Parser类的解析转换逻辑
在原有解析代码基础上,增加遍历转换、生成结果列表的逻辑,示例如下:
import com.google.gson.Gson; import org.apache.commons.io.FileUtils; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public class Parser { private static final String PATH = "try.json"; public static void main(String[] args) throws Exception { // 读取本地JSON文件内容 String jsonContent = FileUtils.readFileToString(new File(PATH), StandardCharsets.UTF_8); // 用Gson解析为Bean对象 Bean originData = new Gson().fromJson(jsonContent, Bean.class); // 初始化存储提取结果的新列表 List<SiteItem> resultList = new ArrayList<>(); // 遍历原始数据,仅提取需要的字段生成自定义对象存入列表 for (Bean.Data dataItem : originData.getData()) { resultList.add(new SiteItem(dataItem.getName(), dataItem.getUrls())); } // 测试输出,效果和你要求的一致 for (SiteItem item : resultList) { System.out.println(item.getName()); for (String url : item.getUrls()) { System.out.printf("\"%s\",%n", url); } System.out.println(); } // 后续可直接通过索引获取对应条目,例如获取第一条数据的名称 // String firstName = resultList.get(0).getName(); // String firstUrl = resultList.get(0).getUrls().get(0); } }
运行输出效果
Google "https://google.com", "https://googl.com", Yandex "https://yandex.ru",
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

