方式一:

下划线与驼峰命名转换:


  1. public class Tool {
  2. private static Pattern linePattern = Pattern.compile("_(\\w)");
  3. /** 下划线转驼峰 */
  4. public static String lineToHump(String str) {
  5. str = str.toLowerCase();
  6. Matcher matcher = linePattern.matcher(str);
  7. StringBuffer sb = new StringBuffer();
  8. while (matcher.find()) {
  9. matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
  10. }
  11. matcher.appendTail(sb);
  12. return sb.toString();
  13. }
  14. /** 驼峰转下划线(简单写法,效率低于{@link #humpToLine2(String)}) */
  15. public static String humpToLine(String str) {
  16. return str.replaceAll("[A-Z]", "_$0").toLowerCase();
  17. }
  18. private static Pattern humpPattern = Pattern.compile("[A-Z]");
  19. /** 驼峰转下划线,效率比上面高 */
  20. public static String humpToLine2(String str) {
  21. Matcher matcher = humpPattern.matcher(str);
  22. StringBuffer sb = new StringBuffer();
  23. while (matcher.find()) {
  24. matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
  25. }
  26. matcher.appendTail(sb);
  27. return sb.toString();
  28. }
  29. public static void main(String[] args) {
  30. String lineToHump = lineToHump("f_parent_no_leader");
  31. System.out.println(lineToHump);// fParentNoLeader
  32. System.out.println(humpToLine(lineToHump));// f_parent_no_leader
  33. System.out.println(humpToLine2(lineToHump));// f_parent_no_leader
  34. }
  35. }

不纠结""_"+matcher.group(0).toLowerCase()"的话,humpToLine2效率会比humpToLine高一些,看String#replaceAll方法源码即可。


方式二:

实体类:

 1 import java.io.Serializable;
2 import lombok.AllArgsConstructor;
3 import lombok.Data;
4 import lombok.NoArgsConstructor;
5
6 @Data
7 @AllArgsConstructor
8 @NoArgsConstructor
9 public class User implements Serializable {
10 /**
11 *
12 */
13 private static final long serialVersionUID = -329066647199569031L;
14
15 private String userName;
16
17 private String orderNo;
18 }

帮助类:

 1 import java.io.IOException;
2
3 import com.fasterxml.jackson.annotation.JsonInclude.Include;
4 import com.fasterxml.jackson.core.JsonProcessingException;
5 import com.fasterxml.jackson.databind.ObjectMapper;
6 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
7
8 /**
9 * JSON的驼峰和下划线互转帮助类
10 *
11 * @author yangzhilong
12 *
13 */
14 public class JsonUtils {
15
16 /**
17 * 将对象的大写转换为下划线加小写,例如:userName-->user_name
18 *
19 * @param object
20 * @return
21 * @throws JsonProcessingException
22 */
23 public static String toUnderlineJSONString(Object object) throws JsonProcessingException{
24 ObjectMapper mapper = new ObjectMapper();
25 mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
26 mapper.setSerializationInclusion(Include.NON_NULL);
27 String reqJson = mapper.writeValueAsString(object);
28 return reqJson;
29 }
30
31 /**
32 * 将下划线转换为驼峰的形式,例如:user_name-->userName
33 *
34 * @param json
35 * @param clazz
36 * @return
37 * @throws IOException
38 */
39 public static <T> T toSnakeObject(String json, Class<T> clazz) throws IOException{
40 ObjectMapper mapper = new ObjectMapper();
   // mapper的configure方法可以设置多种配置(例如:多字段 少字段的处理)
       //mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

41 mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
42 T reqJson = mapper.readValue(json, clazz);
43 return reqJson;
44 }
45 }

单元测试类:

 1 import java.io.IOException;
2
3 import org.junit.Test;
4
5 import com.alibaba.fastjson.JSONObject;
6 import com.fasterxml.jackson.core.JsonProcessingException;
7
8 public class JsonTest {
9
10 @Test
11 public void testToUnderlineJSONString(){
12 User user = new User("张三", "1111111");
13 try {
14 String json = JsonUtils.toUnderlineJSONString(user);
15 System.out.println(json);
16 } catch (JsonProcessingException e) {
17 e.printStackTrace();
18 }
19 }
20
21 @Test
22 public void testToSnakeObject(){
23 String json = "{\"user_name\":\"张三\",\"order_no\":\"1111111\"}";
24 try {
25 User user = JsonUtils.toSnakeObject(json, User.class);
26 System.out.println(JSONObject.toJSONString(user));
27 } catch (IOException e) {
28 e.printStackTrace();
29 }
30 }
31 }

测试结果:

1 {"user_name":"张三","order_no":"1111111"}
2
3 {"orderNo":"1111111","userName":"张三"}
	</div>

java下划线与驼峰命名互转的更多相关文章

  1. JAVA下划线、驼峰相互转换

    /** * 下划线转驼峰 * @param str * @return */ public static String lineToHump(String str) { str = str.toLow ...

  2. MyBatis Generator 下划线转驼峰命名

    MyBatis Generator配置文件--指定生成实体类使用实际的表列名作为实体类的属性名 table标签下的设置属性useActualColumnNames用于指定生成实体类时是否使用实际的列名 ...

  3. mybatis会自动把字段名中的下划线转为驼峰命名法?

    先看一下转化的调用堆栈: 代码如下: 上面代码只是去掉了下划线,并没有首字母小写变大写的代码.再跟进findProperty方法可以找到获取驼峰结果的代码如下: 可以看出通过reflector.fin ...

  4. Java Json 数据下划线与驼峰格式进行相互转换

    概述 今天遇见一个需求,需要对json数据进行下划线与驼峰格式之间进行转换,在Fastjson.Jackson.Gson都提供了转换的方式,在这里进行一下列举. User类: public class ...

  5. hibernate 或jpa 中使用 AliasToBeanResultTransformer 自定义类型转换ResultTransformer 下划线转驼峰

    jpa中使用 sql查询时,返回结果直接转为实体bean的实现, 需要自定义一个ResultTransformer,如下, import java.util.Arrays; import org.ap ...

  6. Mybatis 结果映射下划线转驼峰

    mybatis 结果映射下划线转驼峰 Spring Boot 配置: #下划线转驼峰 mybatis.configuration.map-underscore-to-camel-case=true m ...

  7. python 下划线转驼峰

    # 下划线转驼峰 def str2Hump(text): arr = filter(None, text.lower().split('_')) res = '' j = 0 for i in arr ...

  8. 如何将Map键值的下划线转为驼峰

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:如何将Map键值的下划线转为驼峰: 例,将HashMap实例extMap键值下划线转为驼峰: 代码: HashMap<String ...

  9. mybatis 下划线转驼峰配置

    一直以来,在sqlmap文件中,对于数据库中的下划线字段转驼峰,我们都是通过resultmap来做的,如下: <resultMap id="ISTableStatistics" ...

随机推荐

  1. 工作中常用的Git操作--------(一)

    今天主要记录一下平常工作当中使用的git操作: 1.git的安装这里省略: 2.git的操作指令: 在项目开发中,经常是拉去经理已经搭建好的一个项目,也就是给我们一个git地址.比如:http://g ...

  2. linux——vi和vim的区别

    vi 和vim 的区别   它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面. vim的这些优势主要体现在以下几个方面:1.多级撤消我们知道 ...

  3. htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容

    Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...

  4. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  5. Petrozavodsk Summer Training Camp 2017

    Petrozavodsk Summer Training Camp 2017 Problem A. Connectivity 题目描述:有\(n\)个点,现不断地加边.每条边有一种颜色,如果一个点对\ ...

  6. Petrozavodsk Winter Training Camp 2018

    Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸 ...

  7. SSD回归类物体检测

    本宝宝最近心情不会,反正这篇也是搬用别人博客的了:(SSD就是YOLO+anchor(不同feature map 作为input)) 引言 这篇文章是在YOLO[1]之后的一篇文章,这篇文章目前是一篇 ...

  8. HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...

  9. SG函数(转自百度百科)

    给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Games的抽象 ...

  10. Base Class 慎用箭头函数

    在项目中,child继承base的时候,需要重新修改base.fun的逻辑,但是有些情况下面并不是简单的覆盖,而是在base.fun的逻辑基础上进行加工处理. 刚开始接触es6的时候也许都遇到过,ch ...