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

相关推荐
望获linux2 小时前
【Linux基础知识系列】第一百一十篇 - 使用Nmap进行网络安全扫描
java·linux·开发语言·前端·数据库·信息可视化·php
雷达学弱狗5 小时前
链式法则解释上游梯度应用
开发语言·前端·javascript
最初的↘那颗心6 小时前
Java泛型深度解析:从基础语法到高级应用
java·面向对象·泛型
仙俊红6 小时前
Spring Boot `@Configuration` 与 `@Component` 笔记
java·spring boot·笔记
小清兔8 小时前
c#基础知识
开发语言·数据库·学习·unity·c#·游戏引擎·.net
计算机学姐9 小时前
基于SpringBoot的社团管理系统【2026最新】
java·vue.js·spring boot·后端·mysql·spring·mybatis
天上掉下来个程小白9 小时前
微服务-25.网关登录校验-网关传递用户到微服务
java·数据库·微服务
奇某人9 小时前
【语法】【C+V】本身常用图表类型用法快查【CSDN不支持,VSCODE可用】
开发语言·vscode·markdown·mermaid
做一位快乐的码农10 小时前
php程序设计之基于PHP的手工艺品销售网站/基于php在线销售系统/基于php在线购物商城系统
开发语言·php
vivi_and_qiao10 小时前
HTML的form表单
java·前端·html