提交hutool issue
发表于|更新于
|阅读量:
最近在使用hutool的工具包的时候,发现了一个问题。eanUtil.beanToMap(xx, true, true),使用转换为下划线模式, 输入的字段为customerNickV2, 输出的字段为customer_nick_V2,
这种类型的输出在别的json包里是customer_nick_v2。
状况如下:
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package com.example.demo;
import cn.hutool.core.bean.BeanUtil; import lombok.Data;
import java.util.Map;
public class Test {
@Data static class Person { private Integer num;
private String name;
private String customerNickV2; }
public static void main(String[] args) { Person p = new Person(); p.setCustomerNickV2("我是name"); Map<String, Object> stringObjectMap = BeanUtil.beanToMap(p, true, true); System.out.println(stringObjectMap);
} }
|
然后在github给他们提了个bug
issue链接https://github.com/dromara/hutool/issues/2070
不过我们还是来分析一下这个问题出现的原因,转换下划线的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
public static String toSymbolCase(CharSequence str, char symbol) { if (str == null) { return null; }
final int length = str.length(); final StrBuilder sb = new StrBuilder(); char c; for (int i = 0; i < length; i++) { c = str.charAt(i); final Character preChar = (i > 0) ? str.charAt(i - 1) : null; if (Character.isUpperCase(c)) { final Character nextChar = (i < str.length() - 1) ? str.charAt(i + 1) : null; if (null != preChar && Character.isUpperCase(preChar)) { sb.append(c); } else if (null != nextChar && (false == Character.isLowerCase(nextChar))) { if (null != preChar && symbol != preChar) { sb.append(symbol); } sb.append(c); } else { if (null != preChar && symbol != preChar) { sb.append(symbol); } sb.append(Character.toLowerCase(c)); } } else { if (symbol != c && sb.length() > 0 && Character.isUpperCase(sb.charAt(-1)) && Character.isLowerCase(c)) { sb.append(symbol); } sb.append(c); } } return sb.toString(); }
|
到这里我们就可以知道为什么最后的V2,没有被转化为_v2的原因了。
// 后一个为非小写字母,按照一个词对待
if (null != preChar && symbol != preChar) {
// 前一个是非大写时按照新词对待,加连接符,例如xAB
sb.append(symbol);
}
sb.append(c);
这里的V2会走到这里,然后会拼成_V2,实际应该是 _v2,所以修复就很明显了
sb.append(Character.toLowerCase(c));
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public static String toSymbolCase(CharSequence str, char symbol) { if (str == null) { return null; }
final int length = str.length(); final StrBuilder sb = new StrBuilder(); char c; for (int i = 0; i < length; i++) { c = str.charAt(i); final Character preChar = (i > 0) ? str.charAt(i - 1) : null; if (Character.isUpperCase(c)) { final Character nextChar = (i < str.length() - 1) ? str.charAt(i + 1) : null; if (null != preChar && Character.isUpperCase(preChar)) { sb.append(c); } else if (null != nextChar && (false == Character.isLowerCase(nextChar))) { if (null != preChar && symbol != preChar) { sb.append(symbol); } sb.append(Character.toLowerCase(c)); } else { if (null != preChar && symbol != preChar) { sb.append(symbol); } sb.append(Character.toLowerCase(c)); } } else { if (symbol != c && sb.length() > 0 && Character.isUpperCase(sb.charAt(-1)) && Character.isLowerCase(c)) { sb.append(symbol); } sb.append(c); } } return sb.toString(); }
|