Java JSON String 驼峰转下划线三种方式对比

本文对比了FastJson、Jackson和Gson三种JSON处理库的性能及特点。结果显示,在不同规模的数据处理中,FastJson与Jackson表现相近且优于Gson。此外,还详细介绍了各库在JSON序列化过程中的具体行为差异。

一、使用方式

FastJson

SerializeConfig serializeConfig=new SerializeConfig();
aserializeConfig.propertyNamingStrategy= PropertyNamingStrategy.SnakeCase;
String json = JSON.toJSONString(object, serializeConfig);

Jackson

ObjectMapper mapper=new ObjectMapper();
mapper.setPropertyNamingStrategy(com.fasterxml.jackson.databind.PropertyNamingStrategy.SNAKE_CASE);
String json = mapper.writeValueAsString(object);

Gson

GsonBuilder gsonBuilder=new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson=gsonBuilder.create();
String json = gson.toJson(object);

二、性能对比

**结论:**FastJson 约等于 Jackson > Gson
FastJson与Jackson性能相差不大,在大量数据测试下,Gson性能较差

对一个拥有11个字段的对象测试(仅供参考):

  • 在循环9999次转换时,耗费时间

    • FastJson 108ms
    • Jackson 53ms
    • Gson 73ms
  • 在循环999999次转换时,耗费时间

    • FastJson 448ms
    • Jackson 1138ms
    • Gson 332ms
  • 在循环99999999次转换时,耗费时间

    • FastJson 20418ms
    • Jackson 28276ms
    • Gson 70443ms

三、效果对比

打印json字符串

FastJson

仅转换有值的key-value,java.util.Date将被转换为时间戳
例:

{
    "c_time":1615261985022,
    "data_id":123,
    "conf":{
        "desc":"HaH_a",
        "type":"set"
    },
    "remarks":"ReReRe"
}

Jackson

无值的key也会被转换,对象默认值为null
例:

{
    "id":null,
    "data_id":123,
    "remarks":"ReReRe",
    "status":null,
    "c_time":1615261985022,
    "u_time":null,
    "conf":{
        "key":null,
        "type":"set",
        "desc":"HaH_a"
    }

Gson

仅转换有值的key-value,java.util.Date将被以字符串形式保存
例:

{
    "data_id":123,
    "remarks":"ReReRe",
    "c_time":"Mar 9, 2021 11:53:05 AM",
    "conf":{
        "type":"set",
        "desc":"HaH_a"
    }
}
<think>我们正在使用Hutool工具将实体类换为JSON格式,并实现驼峰命名下划线命名。 步骤: 1. 引入Hutool的JSON依赖(通常使用hutool-all或者单独引入hutool-json) 2. 创建一个实体类 3. 使用Hutool的JSONUtil将实体类换为JSON对象,并在换过程中实现驼峰下划线的命名换 Hutool的JSONUtil默认使用的是原样输出(即不改变字段名),所以我们需要在换之前或换过程中对字段名进行换。 我们可以通过Hutool的BeanUtil将实体类换为一个Map,在换过程中将字段名从驼峰下划线,然后再将MapJSON字符串。 具体步骤: a. 使用BeanUtil.beanToMap方法将JavaBean换为Map,并指定字段名的换规则(使用ToUnderlineCase选项)。 b. 使用JSONUtil.toJsonStr将Map换为JSON字符串。 示例代码: 假设我们有一个实体类User: public class User { private Integer userId; private String userName; // 省略getter和setter } 我们想要换为: {"user_id":1,"user_name":"张三"} 实现: Map<String, Object> map = BeanUtil.beanToMap(user, false, true); // 第二个参数false表示不忽略空值,第三个参数true表示换为下划线命名的key String jsonStr = JSONUtil.toJsonStr(map); 或者,我们也可以使用Hutool的JSONObject,它同样支持从Map构造。 另一种方式是使用Hutool的JSONConfig,但JSONConfig目前不支持字段名的全局换,所以推荐使用上面的方法。 因此,我们按照以下步骤进行: 1. 将实体类通过BeanUtil.beanToMap换为下划线命名的Map。 2. 将Map换为JSON字符串。 注意:Hutool的BeanUtil.beanToMap方法在5.7.2版本中,第三个参数就是是否换为下划线模式。 如果使用Maven,请确保依赖正确: <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.2</version> </dependency> 或者单独引入hutool-core和hutool-json: <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>5.7.2</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-json</artifactId> <version>5.7.2</version> </dependency> 代码示例: 下面是一个完整的示例:</think>### Hutool实现实体类JSON驼峰下划线命名 使用Hutool工具将实体类换为JSON格式并实现驼峰命名到下划线命名的换,可通过以下步骤实现: #### 核心步骤 1. **添加依赖** 在`pom.xml`中引入Hutool依赖: ```xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> <!-- 使用最新版本 --> </dependency> ``` 2. **实体类准备** 定义示例实体类(使用驼峰命名): ```java public class User { private Integer userId; private String userName; private LocalDateTime createTime; // 省略getter/setter } ``` 3. **换实现** 使用`BeanUtil`和`JSONUtil`完成换: ```java import cn.hutool.core.bean.BeanUtil; import cn.hutool.json.JSONUtil; public class Main { public static void main(String[] args) { // 1. 创建实体对象 User user = new User(); user.setUserId(1001); user.setUserName("张三"); user.setCreateTime(LocalDateTime.now()); // 2. 实体Map(驼峰下划线) Map<String, Object> map = BeanUtil.beanToMap( user, new HashMap<>(), false, // 是否忽略null值 true // 关键参数:开启驼峰下划线 ); // 3. MapJSON字符串 String json = JSONUtil.toJsonStr(map); System.out.println(json); } } ``` #### 输出结果 ```json { "user_id": 1001, "user_name": "张三", "create_time": "2023-05-01T12:30:45" } ``` #### 关键说明 1. **`BeanUtil.beanToMap`参数** - 第三个参数 `false`:保留值为`null`的字段 - 第四个参数 `true`:启用驼峰下划线命名规则(核心换开关) 2. **换规则** - `userId` → `user_id` - `userName` → `user_name` - `createTime` → `create_time` - 符合数据库字段命名惯例[^1] 3. **扩展场景** 若需自定义字段名映射,可结合`@JsonProperty`注解: ```java public class User { @JsonProperty("custom_id") // 自定义JSON字段名 private Integer userId; // 其他字段... } ``` #### 注意事项 - **日期格式化**:默认输出`LocalDateTime`为ISO格式,需自定义格式时可使用`JSONConfig`: ```java JSONConfig config = new JSONConfig(); config.setDateFormat("yyyy-MM-dd HH:mm:ss"); String json = JSONUtil.toJsonStr(map, config); ``` - **嵌套对象**:若实体包含嵌套对象,需递归处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热心小伙chj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值