正则匹配json字符串中的key,将kebab-case转换为camelCase
项⽬中遇到处理接⼝返回json的需求:
将json键中的kebab-case转换为camelCase
为解决需求进⾏了⼀系列学习,在此记录学习过程。
⾸先了解⼏种case:
命名法
1. camelCase 驼峰命名(lowerCamelCase)
replaceall()2. snake_case 蛇形命名
3. kebab-case 短横线命名
4. PascalCase 帕斯卡命名(UpperCamelCase)
正则表达式
匹配json中的key
由于觉得以JSONObject形式添⼀个键值对再删⼀个键值对的操作,不是很合理,相当于所有键为⼀个单词以上的键值对都重新添加,如果数据量很⼤…
于是想直接处理字符串,便有了⼀晚上的琢磨(ŏ_ŏ),总算被我试出来了
先把最终匹配到所有键的正则表达式放在这⾥( 对于我使⽤的json数据是完全正确的,如果有遗漏的情况欢迎指点 ):
// by Sheri
// jdk8
String regex ="\"(.+?)\":.*?(?=[,{}])\"?";
// String json = "(a json string)";
Matcher m = Patternpile(regex).matcher(json);
// match到所有的键
while(m.find()){
up(1).contains("-")){
// more than one word
// 进⾏kebab-case到camelCase的转换
}
}
命名法转换
起初想直接替换,jdk11中已有replaceAll的第⼆种调⽤⽅式,可以使⽤lamda表达式直接写好转换逻辑作为参数传⼊:
// jdk11
String s = Patternpile("-([a-z])")
.matcher(json)
.replaceAll(matchResult
-> up(1)
.toUpperCase());
但是由于项⽬某处的import,需要使⽤jdk8环境,没有这⼀个重载的⽅法,并且Matcher的操作有种种限制,我可能没有以最简洁的⽅式解决这个问题,但为了寻能够正确完成需求的⽅法,我算是对Matcher进⾏了⼀番研究
解决问题流⽔账:
——试图直接⽤
存在问题:由于要保证修改的是键不是值,所以第⼀层的matcher匹配的是完整的键字符串。如果⼀个键由三个或以上单词组成,即会出现两个或以上的"-"(hyphen),此时matcher的region会是整个key字符串,⽽上述replaceAll则会同时将所有"-[a-z]“替换成第⼀个”-[a-z]"的⼤写。
例如:last-return-date 替换成 lastReturnRate,⽽本该依次m.find()去转换才能避免该问题。
——借助StringBuffer修改⾮预期的命名法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论