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

Java读取非固定结构JSON文件如何同时获取字段名与值

Java动态读取非固定结构JSON字段及值的实现方案

不要自行实现逐字符解析逻辑,直接使用工业级成熟JSON解析库即可,推荐使用Jackson,性能高、稳定性强,支持树模型遍历动态结构的JSON,完全满足你获取任意字段名和对应值的需求。

1. 引入依赖

Maven项目中添加Jackson核心依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

2. 实现代码

核心逻辑是将JSON解析为树模型JsonNode,递归遍历所有节点,同时提取字段名和对应值:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

public class DynamicJsonReader {
    // ObjectMapper是线程安全的,全局复用单实例即可,不需要每次创建
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    public static void main(String[] args) throws IOException {
        // 读取本地JSON文件
        JsonNode rootNode = OBJECT_MAPPER.readTree(new File("你的JSON文件路径.json"));
        // 递归遍历节点,第一个参数为当前字段的路径前缀,根节点传空即可
        traverseJsonNode("", rootNode);
    }

    private static void traverseJsonNode(String pathPrefix, JsonNode node) {
        // 处理对象类型节点,直接获取所有字段名和对应值
        if (node.isObject()) {
            Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
            while (fields.hasNext()) {
                Map.Entry<String, JsonNode> field = fields.next();
                String fieldName = field.getKey();
                JsonNode valueNode = field.getValue();
                // 拼接完整字段路径,不需要的话可以直接用fieldName输出当前层级字段名
                String fullFieldName = pathPrefix.isEmpty() ? fieldName : pathPrefix + "." + fieldName;
                // 基础类型值直接输出文本,复杂类型输出JSON字符串
                String value = valueNode.isValueNode() ? valueNode.asText() : valueNode.toString();
                System.out.printf("字段名:%s,对应值:%s%n", fullFieldName, value);
                // 递归遍历子节点
                traverseJsonNode(fullFieldName, valueNode);
            }
        }
        // 处理数组类型节点
        else if (node.isArray()) {
            for (int i = 0; i < node.size(); i++) {
                String arrayItemPrefix = pathPrefix + "[" + i + "]";
                traverseJsonNode(arrayItemPrefix, node.get(i));
            }
        }
    }
}

3. 补充说明

  • 以上代码适配任意层级的嵌套JSON结构,不管是对象嵌套还是数组嵌套都可以正确识别所有字段
  • 如果需要处理GB级超大JSON文件,避免全量加载到内存,可以使用Jackson的流式APIJsonParser逐片段解析,性能依然远高于手动解析字符
  • 除Jackson外,也可以使用FastJSON2、Gson等其他JSON库,核心思路都是通过树模型遍历,逻辑完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 04:06:04