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

无需依赖指定键遍历嵌套JSON并拼接子对象值的技术需求

无依赖键的JSON遍历与嵌套值处理方案

核心思路

不用硬编码任何具体键名,全程遍历外层JSON的所有键值对:

  • 对每个值尝试解析为内层JSON,成功则遍历所有子值拼接成字符串
  • 解析失败则直接保留原始值
  • 最后将处理后的键值对批量赋值给目标对象

代码实现(基于org.json库)

import org.json.JSONObject;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.lang.reflect.Method;

public class JsonProcessor {
    public static void processAndAssign(String jsonInput, Object targetObj) throws Exception {
        // 存储处理后的键值对
        Map<String, String> processedData = new HashMap<>();
        
        // 解析外层JSON
        JSONObject outerObject = new JSONObject(jsonInput);
        Iterator<String> outerKeys = outerObject.keys();

        // 遍历所有外层键
        while (outerKeys.hasNext()) {
            String key = outerKeys.next();
            String rawValue = outerObject.optString(key);
            
            try {
                // 尝试解析为内层JSON,判断是否是嵌套结构
                JSONObject innerObject = new JSONObject(rawValue);
                StringBuilder valueBuilder = new StringBuilder();
                Iterator<String> innerKeys = innerObject.keys();
                
                // 遍历内层值并拼接
                while (innerKeys.hasNext()) {
                    String innerVal = innerObject.optString(innerKeys.next());
                    if (valueBuilder.length() > 0) {
                        valueBuilder.append(","); // 可自定义分隔符,比如空格、分号
                    }
                    valueBuilder.append(innerVal);
                }
                processedData.put(key, valueBuilder.toString());
            } catch (Exception e) {
                // 不是有效JSON,直接保留原始值
                processedData.put(key, rawValue);
            }
        }

        // 将处理后的数据赋值给目标对象(用反射适配任意字段)
        for (Map.Entry<String, String> entry : processedData.entrySet()) {
            String fieldName = entry.getKey();
            String processedValue = entry.getValue();
            
            // 拼接setter方法名(假设字段名和setter命名规范匹配:setAd002对应ad002)
            String setterName = "set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
            Method setter = targetObj.getClass().getMethod(setterName, String.class);
            setter.invoke(targetObj, processedValue);
        }
    }
}

关键细节说明

  • 嵌套JSON判断:用try-catch捕获解析异常是最稳妥的方式,避免因格式不规范的字符串导致程序崩溃
  • 拼接规则:示例中用逗号分隔子值,可根据需求改成空格、换行符或其他分隔符
  • 对象赋值:通过反射调用setter方法,无需硬编码字段名,完美适配数千个键的场景;如果目标对象用Map存储数据,直接赋值会更简单

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:50:38