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是非常不方便的

相关推荐
早起鸟儿15 分钟前
docker-Dockerfile 配置
java·linux·运维·docker
云边小网安20 分钟前
java集合篇(六) ---- ListIterator 接口
java·开发语言·青少年编程·java集合
都叫我大帅哥26 分钟前
Spring WebFlux:响应式编程的“未来战士”还是“花架子”?
java·spring·flux
都叫我大帅哥28 分钟前
Reactor 深度解析:响应式编程的「核反应堆」是如何工作的?
java·spring
不太厉害的程序员28 分钟前
NC65配置xml找不到Bean
xml·java·后端·eclipse
不被定义的程序猿30 分钟前
Golang 在 Linux 平台上的并发控制
开发语言·后端·golang
我在北国不背锅1 小时前
基于Java开发的浏览器自动化Playwright-MCP服务器
java·playwright·mcp
陈旭金-小金子1 小时前
发现 Kotlin MultiPlatform 的一点小变化
android·开发语言·kotlin
Mikhail_G1 小时前
Python应用八股文
大数据·运维·开发语言·python·数据分析
LUCIAZZZ2 小时前
钉钉机器人-自定义卡片推送快速入门
java·jvm·spring boot·机器人·钉钉·springboot