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

目录
相关文章
|
2月前
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
146 22
|
5月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
6月前
|
JSON 人工智能 算法
探索大型语言模型LLM推理全阶段的JSON格式输出限制方法
本篇文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
|
6月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
172 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
7月前
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
1290 52
|
7月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
783 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
7月前
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
233 3
|
7月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
7月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
186 1
|
7月前
|
JSON Java 数据格式
springboot中表字段映射中设置JSON格式字段映射
springboot中表字段映射中设置JSON格式字段映射
234 1