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

相关推荐
chuan.bai2 小时前
Java RAG 实战(第 11 篇):RAG 知识工作台网页
java·开发语言·人工智能
离陌在学C#4 小时前
C# 事件(Event)详解:从概念到实战
开发语言·c#
0x535 小时前
网站通信(一)
java
Terra.K5 小时前
Java异常学习[特殊字符]
java·开发语言·学习
葡萄城技术团队6 小时前
InfluxDB 2\.x 深度解析:核心架构、Flux 函数与制造业落地指南(三)
java·开发语言·架构
Super 含6 小时前
Android 启动优化(五):线程、GC 与 IO 为什么会拖慢启动?
java·服务器·数据库
counting money6 小时前
Java IO流详解:从InputStream到文件操作实战
java·开发语言·python
wuyk5557 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无7 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
波特率1152007 小时前
C++新特性---属性说明符与标准属性
开发语言·c++