1 需求说明
在开发过程中,有时会遇到json不是严格按照驼峰命名,需要将其中带有下划线的字段进行格式化转换为驼峰命名。
如果是对JSON格式里的返回字段清楚的情况下,可以进行逐层解析转换。
但是,效率比较低,而且JSON里可能会循环嵌套多层JSONObject或JSONArray。
如何使用通用的方式进行转换?
2 Java工具类转换实现
比较笨的方法,使用工具类进行转化对应的格式
2.1 代码
import java.util.Set; public class JsonUtil { public static void convert(Object obj) { if (obj instanceof JSONArray) { JSONArray jsonArray = (JSONArray) obj; for (Object json : jsonArray) { convert(json); } } else if (obj instanceof JSONObject) { JSONObject json = (JSONObject) obj; Set<String> keySet = json.keySet(); String[] keyArray = keySet.toArray(new String[keySet.size()]); for (String key : keyArray) { Object value = json.get(key); String[] keyStrs = key.split("_"); if (keyStrs.length > 1) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < keyStrs.length; i++) { String keyStr = keyStrs[i]; if (!keyStr.isEmpty()) { if (i == 0) { sb.append(keyStr); } else { int c = keyStr.charAt(0); if (c >= 97 && c <= 122) { int v = c - 32; sb.append((char) v); if (keyStr.length() > 1) { sb.append(keyStr.substring(1)); } } else { sb.append(keyStr); } } } } json.remove(key); json.put(sb.toString(), value); } convert(value); } } } /** * 将json字符串中的key名称中包含下划线的字段,转成驼峰命名格式 * * @param str String格式的JSON串 * @return 转换后的对象(可能是JSONObject或JSONArray) */ public static Object convertUnderlineToCamelCase(String str) { Object obj = JSON.parse(str); convert(obj); return obj; } public static void main(String[] args) { String json = "{\n" + " \"test\": [\n" + " {\n" + " \"self_auth\": {\n" + " \"a_id\": \"123\",\n" + " \"b_num\": 7,\n" + " \"user_name\": \"oldlu\"\n" + " }\n" + " }\n" + " ]\n" + "}"; System.out.println(convertUnderlineToCamelCase(json)); } }
1.2 运行结果
{ "test": [ { "self_auth": { "aId": "123", "bNum": 7, "userName": "oldlu" } } ] }
3 转换为对应的java实体
接口定义是蛇形命名,实体类定义为驼峰
主要依靠这句:@JSONType(naming= PropertyNamingStrategy.SnakeCase)
import com.alibaba.fastjson.PropertyNamingStrategy; import com.alibaba.fastjson.annotation.JSONType; @JSONType(naming= PropertyNamingStrategy.SnakeCase) public class TestJSON { private String aBcD; public String getaBcD() { return aBcD; } public void setaBcD(String aBcD) { this.aBcD = aBcD; } } import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; public class Test { public static void main(String[] args) { TestJSON testJSON = new TestJSON(); testJSON.setaBcD("aaa"); System.out.println(JSONObject.toJSON(testJSON)); String json = "{\"a_bc_d\":\"aaa\"}"; TestJSON testJSON1 = JSON.parseObject(json, TestJSON.class); System.out.println(JSONObject.toJSON(testJSON1)); } }
结果为:
注:看到结果还是下划线不影响最终转换,如果需要返回不是驼峰的把注解去调即可。
public class TestJSON { private String aBcD; public String getaBcD() { return aBcD; } public void setaBcD(String aBcD) { this.aBcD = aBcD; } } class Test { public static void main(String[] args) { TestJSON testJSON = new TestJSON(); testJSON.setaBcD("aaa"); System.out.println(JSONObject.toJSON(testJSON)); String json = "{\"a_bc_d\":\"aaa\"}"; TestJSON testJSON1 = JSON.parseObject(json, TestJSON.class); System.out.println(JSONObject.toJSON(testJSON1)); } }