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

 

1
0
« 上一篇:JAVA中的CountDownLatch、CyclicBarrier、Semaphore的简单测试
» 下一篇:SpringBoot配置RestTemplate的代理和超时时间
	</div>
posted @ 2018-12-09 13:28  学不死的程序员  阅读(84200)  评论(0编辑  收藏  举报