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

如何使用Java 8获取动态JSON对象中的指定字段值

处理含动态键的JSON,提取特定字段值

你的问题核心是JSON里有动态生成的键(比如示例里的txn_f2a7802c-ef84-43c3-8615-5f706b995c23),需要穿透这个动态键去获取内部的特定值(比如refundState或amount.value)。现有代码的check方法只遍历当前层级的键,没法处理嵌套结构和动态键的情况,我来给你调整一下:

方案1:递归遍历所有层级,定位目标键

如果不确定目标键在JSON的哪一层,可以写一个递归方法,遍历所有嵌套的JSON对象,找到匹配的键并返回对应值:

import com.google.gson.*;
import java.util.Set;

public class JsonDynamicKeyHandler {
    public static void main(String[] args) {
        String json2 = "{\n" +
                "  \"refundStatusDetails\": {\n" +
                "    \"txn_f2a7802c-ef84-43c3-8615-5f706b995c23\": {\n" +
                "      \"refundTransactionId\": \"txn_f2a7802c-ef84-43c3-8615-5f706b995c23\",\n" +
                "      \"requestId\": \"refund-request-id-1\",\n" +
                "      \"refundState\": \"REFUND_COMPLETED\",\n" +
                "      \"amount\": {\n" +
                "        \"currency\": \"INR\",\n" +
                "        \"value\": \"10.00\"\n" +
                "      },\n" +
                "      \"refundRequestedTime\": 1513788119505\n" +
                "    }\n" +
                "  }\n" +
                "}";
        System.out.println("原始JSON: " + json2);
        JsonParser p = new JsonParser();
        JsonElement root = p.parse(json2);
        
        // 获取refundState的值
        String refundState = findValueByKey(root, "refundState");
        System.out.println("refundState的值: " + refundState);
        
        // 获取amount.value的值
        String value = findValueByKey(root, "value");
        System.out.println("value的值: " + value);
    }

    private static String findValueByKey(JsonElement jsonElement, String targetKey) {
        // 如果是JSON对象,遍历所有键值对
        if (jsonElement.isJsonObject()) {
            Set<Map.Entry<String, JsonElement>> entrySet = jsonElement.getAsJsonObject().entrySet();
            for (Map.Entry<String, JsonElement> entry : entrySet) {
                String key = entry.getKey();
                JsonElement value = entry.getValue();
                
                // 当前键匹配,返回对应值(字符串类型直接取原始值)
                if (key.equals(targetKey)) {
                    return value.isJsonPrimitive() ? value.getAsString() : value.toString();
                }
                
                // 递归遍历嵌套的JSON对象或数组
                String nestedValue = findValueByKey(value, targetKey);
                if (nestedValue != null) {
                    return nestedValue;
                }
            }
        }
        // 如果是JSON数组,遍历每个元素
        else if (jsonElement.isJsonArray()) {
            for (JsonElement element : jsonElement.getAsJsonArray()) {
                String nestedValue = findValueByKey(element, targetKey);
                if (nestedValue != null) {
                    return nestedValue;
                }
            }
        }
        return null;
    }
}

方案2:针对已知结构,直接穿透动态键

如果JSON结构固定(比如refundStatusDetails下只有一个动态键对象),可以直接定位到动态键对应的对象,再提取目标字段,效率更高:

import com.google.gson.*;
import java.util.Map;

public class JsonDynamicKeyHandler {
    public static void main(String[] args) {
        String json2 = "{\n" +
                "  \"refundStatusDetails\": {\n" +
                "    \"txn_f2a7802c-ef84-43c3-8615-5f706b995c23\": {\n" +
                "      \"refundTransactionId\": \"txn_f2a7802c-ef84-43c3-8615-5f706b995c23\",\n" +
                "      \"requestId\": \"refund-request-id-1\",\n" +
                "      \"refundState\": \"REFUND_COMPLETED\",\n" +
                "      \"amount\": {\n" +
                "        \"currency\": \"INR\",\n" +
                "        \"value\": \"10.00\"\n" +
                "      },\n" +
                "      \"refundRequestedTime\": 1513788119505\n" +
                "    }\n" +
                "  }\n" +
                "}";
        JsonParser p = new JsonParser();
        JsonElement root = p.parse(json2);
        
        // 获取refundStatusDetails对象
        JsonObject refundStatusDetails = root.getAsJsonObject().getAsJsonObject("refundStatusDetails");
        
        // 获取动态键对应的对象(因为只有一个,直接取第一个entry)
        JsonObject txnObject = refundStatusDetails.entrySet().iterator().next().getValue().getAsJsonObject();
        
        // 提取refundState
        String refundState = txnObject.get("refundState").getAsString();
        System.out.println("refundState: " + refundState);
        
        // 提取amount.value
        String value = txnObject.getAsJsonObject("amount").get("value").getAsString();
        System.out.println("value: " + value);
    }
}

说明

  • 方案1适合结构不固定、目标键位置未知的场景,递归遍历所有层级找到匹配键;
  • 方案2适合结构固定的场景,直接定位动态键层级,性能更优;
  • 注意处理JSON类型(比如JsonPrimitive的字符串用getAsString()可以直接去掉引号,拿到原始值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:22:46