Java 将json中key值中带有下划线的部分转为驼峰格式

一、背景说明

在开发过程中,有时会遇到第三方厂商提供的接口返回结果不是严格按照驼峰命名,需要将其中带有下划线的字段进行格式化转换为驼峰命名。

如下图中的self_authuser_iduser_namecreator_nameothers_auths 等 key 值。

如果是对 JSON 格式里的返回字段清楚的情况下,可以进行逐层解析转换。
但是,效率比较低,而且 JSON 里可能会循环嵌套多层 JSONObject 或 JSONArray。

如何使用通用的方式进行转换?
在这里插入图片描述


二、Java语言实现

1、代码
package com.miracle.luna.json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.Set;

/**
 * @author Miracle Luna
 * @date 2022/4/30
 */
public class JsonUtil {

    public static void convert(Object obj) {
        if (obj instanceof JSONArray) {
            JSONArray jsonArray = (JSONArray) obj;
            for (Object json : jsonArray) {
                convert(json);
            }
        } else if (obj instanceof JSONObject) {
            JSONObject json = (JSONObject) obj;
            Set<String> keySet = json.keySet();
            String[] keyArray = keySet.toArray(new String[keySet.size()]);
            for (String key : keyArray) {
                Object value = json.get(key);
                String[] keyStrs = key.split("_");
                if (keyStrs.length > 1) {
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < keyStrs.length; i++) {
                        String keyStr = keyStrs[i];
                        if (!keyStr.isEmpty()) {
                            if (i == 0) {
                                sb.append(keyStr);
                            } else {
                                int c = keyStr.charAt(0);
                                if (c >= 97 && c <= 122) {
                                    int v = c - 32;
                                    sb.append((char) v);
                                    if (keyStr.length() > 1) {
                                        sb.append(keyStr.substring(1));
                                    }
                                } else {
                                    sb.append(keyStr);
                                }
                            }
                        }
                    }
                    json.remove(key);
                    json.put(sb.toString(), value);
                }
                convert(value);
            }
        }
    }

    /**
     * 将json字符串中的key名称中包含下划线的字段,转成驼峰命名格式
     *
     * @param str String格式的JSON串
     * @return 转换后的对象(可能是JSONObject或JSONArray)
     */
    public static Object convertUnderlineToCamelCase(String str) {
        Object obj = JSON.parse(str);
        convert(obj);
        return obj;
    }

    public static void main(String[] args) {
        String json = "{\"namespaces\":[{\"self_auth\":{\"user_id\":\"050b12577f00269a1fcfc01f65239697\",\"auth\":7,\"user_name\":\"user\"},\"auth\":7,\"name\":\"group\",\"creator_name\":\"username\",\"id\":1343008,\"others_auths\":[{\"user_id\":\"06d89c3b6d800f2d1f28c01f0d882285\",\"auth\":1,\"user_name\":\"user_01\"},{\"user_id\":\"050b12577f00269a1fcfc01f65239697\",\"auth\":7,\"user_name\":\"user\"}]}]}";
        System.out.println(convertUnderlineToCamelCase(json));
    }
}

2、运行结果
{"namespaces":[{"selfAuth":{"auth":7,"userName":"user","userId":"050b12577f00269a1fcfc01f65239697"},"auth":7,"name":"group","creatorName":"username","id":1343008,"othersAuths":[{"auth":1,"userName":"user_01","userId":"06d89c3b6d800f2d1f28c01f0d882285"},{"auth":7,"userName":"user","userId":"050b12577f00269a1fcfc01f65239697"}]}]}

格式化后,带下划线的 key 值,已经全部转为驼峰命名格式。

self_authuser_iduser_namecreator_nameothers_auths
转为
selfAuthuserIduserNamecreatorNameothersAuths

效果如下:
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值