java下划线与驼峰命名互转

方式一:

下划线与驼峰命名转换:

public class Tool {
	private static Pattern linePattern = Pattern.compile("_(\\w)");
 
	/** 下划线转驼峰 */
	public static String lineToHump(String str) {
		str = str.toLowerCase();
		Matcher matcher = linePattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		while (matcher.find()) {
			matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
		}
		matcher.appendTail(sb);
		return sb.toString();
	}
 
	/** 驼峰转下划线(简单写法,效率低于{@link #humpToLine2(String)}) */
	public static String humpToLine(String str) {
		return str.replaceAll("[A-Z]", "_$0").toLowerCase();
	}
 
	private static Pattern humpPattern = Pattern.compile("[A-Z]");
 
	/** 驼峰转下划线,效率比上面高 */
	public static String humpToLine2(String str) {
		Matcher matcher = humpPattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		while (matcher.find()) {
			matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
		}
		matcher.appendTail(sb);
		return sb.toString();
	}
 
	public static void main(String[] args) {
		String lineToHump = lineToHump("f_parent_no_leader");
		System.out.println(lineToHump);// fParentNoLeader
		System.out.println(humpToLine(lineToHump));// f_parent_no_leader
		System.out.println(humpToLine2(lineToHump));// f_parent_no_leader
	}
}

不纠结""_"+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
« 上一篇: Mybatis实战之TypeHandler高级进阶
» 下一篇: 对Java Serializable(序列化)的理解和总结(一)
	</div>
posted @   学不死的程序员  阅读(84384)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
· 全程使用 AI 从 0 到 1 写了个小工具
点击右上角即可分享
微信分享提示