java下划线与驼峰命名互转

Posted 学不死的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java下划线与驼峰命名互转相关的知识,希望对你有一定的参考价值。

方式一:

下划线与驼峰命名转换:

  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":"张三"}

 







以上是关于java下划线与驼峰命名互转的主要内容,如果未能解决你的问题,请参考以下文章

PHP把下划线分隔命名的字符串与驼峰式命名互转

驼峰命名和下划线命名互转php实现

Java/Spring/Jackson 驼峰-下划线字段转换

jackson 常用注解,比如忽略某些属性,驼峰和下划线互转

怎么用java实现驼峰命名法与数据库命名法的相互转换

java实体类驼峰命名的好处在哪里??