Java将json中key值下划线转为驼峰格式

简介: Java将json中key值下划线转为驼峰格式

1 需求说明

在开发过程中,有时会遇到json不是严格按照驼峰命名,需要将其中带有下划线的字段进行格式化转换为驼峰命名。

如果是对JSON格式里的返回字段清楚的情况下,可以进行逐层解析转换。

但是,效率比较低,而且JSON里可能会循环嵌套多层JSONObject或JSONArray。

如何使用通用的方式进行转换?

2 Java工具类转换实现

比较笨的方法,使用工具类进行转化对应的格式

2.1 代码

import java.util.Set;
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 = "{\n" +
                "  \"test\": [\n" +
                "    {\n" +
                "      \"self_auth\": {\n" +
                "        \"a_id\": \"123\",\n" +
                "        \"b_num\": 7,\n" +
                "        \"user_name\": \"oldlu\"\n" +
                "      }\n" +
                "    }\n" +
                "  ]\n" +
                "}";
        System.out.println(convertUnderlineToCamelCase(json));
    }
}

1.2 运行结果

{
  "test": [
    {
      "self_auth": {
        "aId": "123",
        "bNum": 7,
        "userName": "oldlu"
      }
    }
  ]
}

3 转换为对应的java实体

接口定义是蛇形命名,实体类定义为驼峰

主要依靠这句:@JSONType(naming= PropertyNamingStrategy.SnakeCase)

import com.alibaba.fastjson.PropertyNamingStrategy;
import com.alibaba.fastjson.annotation.JSONType;
@JSONType(naming= PropertyNamingStrategy.SnakeCase)
public class TestJSON {
    private String aBcD;
    public String getaBcD() {
        return aBcD;
    }
    public void setaBcD(String aBcD) {
        this.aBcD = aBcD;
    }
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class Test {
    public static void main(String[] args) {
        TestJSON testJSON = new TestJSON();
        testJSON.setaBcD("aaa");
        System.out.println(JSONObject.toJSON(testJSON));
        String json = "{\"a_bc_d\":\"aaa\"}";
        TestJSON testJSON1 = JSON.parseObject(json, TestJSON.class);
        System.out.println(JSONObject.toJSON(testJSON1));
    }
}

结果为:

注:看到结果还是下划线不影响最终转换,如果需要返回不是驼峰的把注解去调即可。

public class TestJSON {
    private String aBcD;
    public String getaBcD() {
        return aBcD;
    }
    public void setaBcD(String aBcD) {
        this.aBcD = aBcD;
    }
}
class Test {
    public static void main(String[] args) {
        TestJSON testJSON = new TestJSON();
        testJSON.setaBcD("aaa");
        System.out.println(JSONObject.toJSON(testJSON));
        String json = "{\"a_bc_d\":\"aaa\"}";
        TestJSON testJSON1 = JSON.parseObject(json, TestJSON.class);
        System.out.println(JSONObject.toJSON(testJSON1));
    }
}

557d898ba7e7494dbd5c0e0a655539f0.png

目录
相关文章
|
24天前
|
JSON 前端开发 Java
Json格式数据解析
Json格式数据解析
|
2月前
|
JSON 前端开发 JavaScript
|
2天前
|
存储 JSON DataWorks
DataWorks产品使用合集之DataWorks将 MongoDB 中的数组类型写入到 DataWorks 的单个字段时,表示为字符串格式而非 JSON 格式如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
12 3
|
8天前
|
Java
Java基础知识整理,驼峰规则、流程控制、自增自减
在这一篇文章中我们总结了包括注释、关键字、运算符的Java基础知识点,今天继续来聊一聊命名规则(驼峰)、流程控制、自增自减。
36 3
|
17天前
|
存储 JSON NoSQL
MongoDB的文档存储格式BSON和JSON的区别
MongoDB的文档存储格式BSON和JSON的区别
|
23天前
|
XML JSON JavaScript
Java中XML和JSON的比较与应用指南
本文对比了Java中XML和JSON的使用,XML以自我描述性和可扩展性著称,适合结构复杂、需验证的场景,但语法冗长。JSON结构简洁,适用于轻量级数据交换,但不支持命名空间。在Java中,处理XML可使用DOM、SAX解析器或XPath,而JSON可借助GSON、Jackson库。根据需求选择合适格式,注意安全、性能和可读性。
28 0
|
29天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
2月前
|
存储 JSON Apache
揭秘 Variant 数据类型:灵活应对半结构化数据,JSON查询提速超 8 倍,存储空间节省 65%
在最新发布的阿里云数据库 SelectDB 的内核 Apache Doris 2.1 新版本中,我们引入了全新的数据类型 Variant,对半结构化数据分析能力进行了全面增强。无需提前在表结构中定义具体的列,彻底改变了 Doris 过去基于 String、JSONB 等行存类型的存储和查询方式。
揭秘 Variant 数据类型:灵活应对半结构化数据,JSON查询提速超 8 倍,存储空间节省 65%
|
2天前
|
JSON 数据格式 Python
Python标准库中包含了json模块,可以帮助你轻松处理JSON数据
【4月更文挑战第30天】Python的json模块简化了JSON数据与Python对象之间的转换。使用`json.dumps()`可将字典转为JSON字符串,如`{&quot;name&quot;: &quot;John&quot;, &quot;age&quot;: 30, &quot;city&quot;: &quot;New York&quot;}`,而`json.loads()`则能将JSON字符串转回字典。通过`json.load()`从文件读取JSON数据,`json.dump()`则用于将数据写入文件。
8 1
|
5天前
|
存储 JSON 数据处理