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-杂项,json&jsonp
</div>