JSONObject 比 Map好使的地方

需求:改originalJson中的json字符串的key,当key满足在configMapping中配置的key2情况的时候,把originalJson的key改成 configMapping中的value2。

上代码:

java 复制代码
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;

public class JsonKeyExtractor {

    public static void main(String[] args) {
        // 原始键值映射 key value
        JSONObject originalJson = new JSONObject();
        originalJson.put("accountStatuses1","accountStatuses_test");
        originalJson.put("marketplaceId1","marketplaceId_test");
        originalJson.put("performanceMetrics1","performanceMetrics_test");
        // 要进行替换的键值映射 key2 value2
        JSONObject configMapping = new JSONObject();
        configMapping.put("accountStatuses1", "accountStatuses");
        configMapping.put("marketplaceId1", "marketplaceId");
        configMapping.put("performanceMetrics1", "performanceMetrics");
        // 调用递归函数进行键替换
        replaceKeys(originalJson, configMapping);
        // 输出替换后的 JSON
        System.out.println(originalJson.toString());
    }

    // 递归替换函数
    private static void replaceKeys(JSONObject jsonObject, JSONObject keyMapping) {
        for (String key:jsonObject.keySet()){
            if (keyMapping.containsKey(key)) {
                // 如果键需要替换,进行替换
                String replacementKey = keyMapping.get(key).toString();
                jsonObject.put(replacementKey, jsonObject.get(key));
                jsonObject.remove(key);
                replaceKeys(jsonObject, keyMapping);
                //立刻return重跑,否则修改了json结构,下一轮for就报错。
                return;
            }
            if (jsonObject.get(key) instanceof JSONObject) {
                // 如果值是 JSONObject,递归调用
                replaceKeys(jsonObject.getJSONObject(key), keyMapping);
            } else if (jsonObject.get(key) instanceof JSONArray) {
                // 如果值是 JSONArray,遍历数组中的元素
                JSONArray jsonArray = jsonObject.getJSONArray(key);
                for (int i = 0; i < jsonArray.size(); i++) {
                    if (jsonArray.get(i) instanceof JSONObject) {
                        // 如果数组元素是 JSONObject,递归调用
                        replaceKeys(jsonArray.getJSONObject(i), keyMapping);
                    }
                }
            }
        }
    }
}

输出:

{

"performanceMetrics":"performanceMetrics_test",

"accountStatuses":"accountStatuses_test",

"marketplaceId":"marketplaceId_test"

}

假设用的不是JSONObject而是Map,这个方法就不是这么好写了。

比如:

java 复制代码
package cn.net.cdsz.ccb.test;

import club.newepoch.utils.JsonUtils;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

public class JsonKeyReplacementDemo {
    public static void main(String[] args) {
        // 创建一个 JSON 对象
        Map<String, Object>  jsonObject = new HashMap<>();
        jsonObject.put("name", "John");
        jsonObject.put("age", "30");

        // 创建一个键的映射关系
        Map<String, String>  keyMapping = new HashMap();
        keyMapping.put("name", "fullName");

        // 调用替换函数
        replaceKeys(jsonObject, keyMapping);

        // 打印替换后的 JSON 对象
        System.out.println(JsonUtils.toJSONString(jsonObject));
    }

    public static void replaceKeys(Map<String, Object> jsonObject, Map<String, String> keyMapping) {
        for (String key : new HashSet<>(jsonObject.keySet())) {
            if (keyMapping.containsKey(key)) {
                // 如果键需要替换,进行替换
                String replacementKey = keyMapping.get(key);
                jsonObject.put(replacementKey, jsonObject.get(key));
                jsonObject.remove(key);
            }
            String value = jsonObject.get(key).toString();
            if (value != null && value.startsWith("{")) {
                // 如果值是 JSON 格式的字符串,解析为 Map
                Map<String, Object> innerJsonData = parseJsonString(value);
                replaceKeys(innerJsonData, keyMapping);
                jsonObject.put(key, toJsonString(innerJsonData));
            }
        }
    }

    // 解析 JSON 字符串为 Map
    private static Map<String, Object> parseJsonString(String jsonString) {
        // 此处需要使用 JSON 解析库来实现解析过程
        // 这里仅为示例,需要替换为实际的 JSON 解析方法
        // 你可以使用其他 JSON 解析库来解析 JSON 字符串为 Map
        return null;
    }

    // 将 Map 转换为 JSON 字符串
    private static String toJsonString(Map<String, Object> jsonData) {
        // 此处需要使用 JSON 序列化库来实现转换过程
        // 这里仅为示例,需要替换为实际的 JSON 序列化方法
        // 你可以使用其他 JSON 序列化库来将 Map 转换为 JSON 字符串
        return null;
    }
}

这样用Map是非常不方便的

相关推荐
收破烂的小熊猫~6 分钟前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
猴哥源码14 分钟前
基于Java+SpringBoot的动物领养平台
java·spring boot
老任与码18 分钟前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
小兵张健19 分钟前
武汉拿下 23k offer 经历
java·面试·ai编程
FreeBuf_29 分钟前
Apache组件遭大规模攻击:Tomcat与Camel高危RCE漏洞引发数千次利用尝试
java·tomcat·apache
nananaij36 分钟前
【Python进阶篇 面向对象程序设计(3) 继承】
开发语言·python·神经网络·pycharm
无妄-202440 分钟前
软件架构升级中的“隐形地雷”:版本选型与依赖链风险
java·服务器·网络·经验分享
qqxhb44 分钟前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
阿蒙Amon1 小时前
为什么 12 版仍封神?《C# 高级编程》:从.NET 5 到实战架构,进阶者绕不开的必修课
开发语言·c#
无小道1 小时前
c++-引用(包括完美转发,移动构造,万能引用)
c语言·开发语言·汇编·c++