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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:35