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
分类: JAVA-杂项,json&jsonp
</div>
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
· 全程使用 AI 从 0 到 1 写了个小工具