Java从JSON数组提取所有name字段生成List<String>的实现方法
嘿,既然你不想额外创建实体类,完全可以用Gson的原生JSON解析API来搞定,不用定义多余的类。我给你两种实用的实现方式:
方法一:直接遍历JsonArray节点
这种方法直接操作Gson的JSON节点对象,逻辑清晰,还能灵活处理字段不存在的情况:
import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import java.util.ArrayList; import java.util.List; public class NameExtractor { public static void main(String[] args) { String jsonString = "[ { \"id\":\"0\", \"name\":\"Bob\", \"place\":\"Colorado\" }, { \"id\":\"1\", \"name\":\"John\", \"place\":\"Chicago\" }, { \"id\":\"2\", \"name\":\"Marry\", \"place\":\"Miami\" } ]"; // 解析JSON字符串为JsonArray JsonArray jsonArray = JsonParser.parseString(jsonString).getAsJsonArray(); List<String> nameList = new ArrayList<>(); // 逐个遍历JSON对象,提取name字段 for (JsonElement element : jsonArray) { JsonObject jsonObject = element.getAsJsonObject(); // 先判断字段是否存在,避免空指针异常 if (jsonObject.has("name")) { nameList.add(jsonObject.get("name").getAsString()); } } // 输出结果:[Bob, John, Marry] System.out.println(nameList); } }
说明:这种方式不需要任何实体类,直接和Gson的底层JSON结构交互,适合简单的字段提取场景,容错性也不错。
方法二:用TypeToken结合Map+Stream流
如果你喜欢更简洁的流式处理,可以把JSON数组解析成List<Map<String, Object>>,再用Stream提取字段:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class NameExtractor { public static void main(String[] args) { String jsonString = "[ { \"id\":\"0\", \"name\":\"Bob\", \"place\":\"Colorado\" }, { \"id\":\"1\", \"name\":\"John\", \"place\":\"Chicago\" }, { \"id\":\"2\", \"name\":\"Marry\", \"place\":\"Miami\" } ]"; Gson gson = new Gson(); // 利用TypeToken解析成List<Map>,避免泛型类型擦除问题 List<Map<String, Object>> jsonMapList = gson.fromJson( jsonString, new TypeToken<List<Map<String, Object>>>() {}.getType() ); // 用Stream流提取并过滤非空的name值 List<String> nameList = jsonMapList.stream() .map(map -> (String) map.get("name")) .filter(name -> name != null) .collect(Collectors.toList()); // 输出结果:[Bob, John, Marry] System.out.println(nameList); } }
说明:这种方式更灵活,适合字段不确定的场景,不过要注意类型转换的安全性,最好加上类型检查或者过滤逻辑。
另外提一句,你之前写的gson.fromJson(jsonString, " ".class)是错误的,第二个参数需要传入正确的目标类型(比如数组类型、TypeToken生成的类型),而不是字符串的Class对象。
内容的提问来源于stack exchange,提问作者alle3x
相关产品推荐
相关产品推荐

