场景:
不知道从哪里接口拿出来的数据, 数据是没问题,但是key很多是下划线‘_’的方式 ,比较头疼。
跟前端对接,拿不出手。
看看转换之前的效果:
{"user_code":"YM110034567","user_id":125,"name":"JCccc","age":"18"}
我们要的是转换成驼峰的:
{"name":"JCccc","userId":125,"age":"18","userCode":"YM110034567"}
最好是通过实体填充给出去 :
User(userId=125, name=JCccc, userCode=YM110034567, age=18)
上代码:
依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.69</version>
</dependency>
工具类函数:
/**
* 将对象属性下划线格式转换为驼峰命名格式
* @param json
*/
public static void convert(Object json) {
if (json instanceof JSONArray) {
JSONArray arr = (JSONArray) json;
for (Object obj : arr) {
convert(obj);
}
} else if (json instanceof JSONObject) {
JSONObject jo = (JSONObject) json;
Set<String> keys = jo.keySet();
String[] array = keys.toArray(new String[keys.size()]);
for (String key : array) {
Object value = jo.get(key);
String[] key_strs = key.split("_");
if (key_strs.length > 1) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < key_strs.length; i++) {
String ks = key_strs[i];
if (!"".equals(ks)) {
if (i == 0) {
sb.append(ks);
} else {
int c = ks.charAt(0);
if (c >= 97 && c <= 122) {
int v = c - 32;
sb.append((char) v);
if (ks.length() > 1) {
sb.append(ks.substring(1));
}
} else {
sb.append(ks);
}
}
}
}
jo.remove(key);
jo.put(sb.toString(), value);
}
convert(value);
}
}
}
/**
* 将json字符串字段下划线命名格式转换为驼峰命名格式
* @param json
* @return
*/
public static Object convert(String json) {
Object obj = JSON.parse(json);
convert(obj);
return obj;
}
示例:
public static void main(String[] args) {
//模拟得到的带下划线的 数据 (不要问怎么有这种数据,经历过)
JSONObject jsonObject=new JSONObject();
jsonObject.put("user_id",125L);
jsonObject.put("name","JCccc");
jsonObject.put("user_code","YM110034567");
jsonObject.put("age","18");
System.out.println("看看转换之前的效果:"+jsonObject.toJSONString());
//进行转换
convert(jsonObject);
//看看转换完的效果
System.out.println("看看转换之后的效果:"+jsonObject.toJSONString());
User user = JSON.parseObject(jsonObject.toJSONString(), User.class);
System.out.println("直接转成user实体:"+user.toString());
}
效果是OK的:
好的,该篇就到这。