WAST 是一个高性能 Java 工具集库包,包括 JSON、YAML、CSV、HttpClient、JDBC 和 EL 引擎.
JSON 全场景性能优化到了极致,全场景包括 JDK6-JDK25,内容包括短 JSON,中长 JSON 以及超长 JSON 读写性能,以及输入流按需解析等等。
源码地址
性能测试:
v0.0.29 主要更新
JDBC
- JDBC 增加updateList和mysqlBatchReplace方法;
- JDBC IN 查询数组空集合判断错误修改;
JSON
- 删除JSONCustomMapper类,使用JSONTypeMapper类取代;
- 删除JSON类中与JSONCustomMapper相关的api,使用JSONTypeMapper类方法取代;
- 删除custom包下面的JsonDeserializer和JsonSerializer以及注解@JsonDeserialize和@JsonSerialize注解,使用@JsonProperty里面的mapper()->JSONTypeFieldMapper替代;
- 增加JSONTypeModule类和JSON.register(module)等API来集中化注册序列化和反序列化组件;
- 修复JDK8 字节数组作为输入空字符串解析bug;
- 修复Integer/Long等值类型为null时,返回0的问题;
- 支持Map类的key转下划线输出;
- 删除ReadOption.UseJDKDoubleParser和WriteOption.WriteDecimalUseToString等浮点数读写配置项;
- 原JSON类所有的api方法提供实例化调用(JSONInstance), 支持根据不同的场景切换不同的模式来保证高性能;
- 修复POJO解析key为""时异常问题;
- JSON美化格式化字符串支持设置限制层级缩进,提高可读性;
- 添加java.time下面的ZoneId, Duration, Period, Year, Month, YearMonth, MonthDay读写适配;
相关示例
JSON美化格式化缩进限制示例
import io.github.wycst.wast.json.JSON;
import io.github.wycst.wast.json.JSONConfig;
import io.github.wycst.wast.json.options.WriteOption;
public class JSONPrettyTest {
public static void main(String[] args) {
String json = "{\n" +
"\t\"a\": {\n" +
"\t\t\"b\": {\n" +
"\t\t\t\"c\": {\n" +
"\t\t\t\t\"d\": {\n" +
"\t\t\t\t\t\"e\": {\n" +
"\t\t\t\t\t\t\"f\": {\n" +
"\t\t\t\t\t\t\t\"values\": [1, 2, 3]\n" +
"\t\t\t\t\t\t}\n" +
"\t\t\t\t\t}\n" +
"\t\t\t\t}\n" +
"\t\t\t}\n" +
"\t\t}\n" +
"\t},\n" +
"\t\"address\": {\n" +
"\t\t\"province\": \"beijing\",\n" +
"\t\t\"city\": \"beijing\"\n" +
"\t},\n" +
"\t\"hobbies\": [\"football\", \"basketball\", \"swimming\"]\n" +
"}";
Object object = JSON.parse(json);
// 常规缩进(不限制)
System.out.println(JSON.toPrettifyJsonString(object));
//{
// "a": {
// "b": {
// "c": {
// "d": {
// "e": {
// "f": {
// "values": [
// 1,
// 2,
// 3
// ]
// }
// }
// }
// }
// }
// },
// "address": {
// "province": "beijing",
// "city": "beijing"
// },
// "hobbies": [
// "football",
// "basketball",
// "swimming"
// ]
//}
// 限制缩进层级2
System.out.println(JSON.toJsonString(object, WriteOption.FormatMaxIndentLevelTwo));
// {
// "a":{
// "b":{"c":{"d":{"e":{"f":{"values":[1,2,3]}}}}}
// },
// "address":{
// "province":"beijing",
// "city":"beijing"
// },
// "hobbies":[
// "football",
// "basketball",
// "swimming"
// ]
//}
// 更多级别例如4级
System.out.println(JSON.toJsonString(object, JSONConfig.formatOf().maxIndentLevel(4)));
// {
// "a": {
// "b": {
// "c": {
// "d": {"e": {"f": {"values": [1,2,3]}}}
// }
// }
// },
// "address": {
// "province": "beijing",
// "city": "beijing"
// },
// "hobbies": [
// "football",
// "basketball",
// "swimming"
// ]
//}
}
}
当层级很多或者某个字符串内容特别长导致无法一屏查看/复制能起到不错的效果。
JSON实例化API示例
一个JSONInstance可以对应一个场景示例,示例本身是线程安全的一个场景只需要创建一个实例即可。
通常情况下如果输入的JSON字符串字段结构和实体类定义的字段结构不一致,常规的处理是给实体类字段添加注解@JsonProperty别名例如下:
@JsonProperty(name = "name")
private String userName;
此种方式无法直接满足既要又要的需求场景,比如场景1输出name, 场景2输出userName,甚至场景3输出 user_name等等,往往需要代码做中间转化。
新版本提供了JSON实例化调用,可以给实体类设置不通的别名。
import io.github.wycst.wast.json.JSONInstance;
import io.github.wycst.wast.json.annotations.JsonProperty;
public class JSONPojoTest {
@JsonProperty(name = "name")
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public static void main(String[] args) {
JSONPojoTest jsonPojoTest = new JSONPojoTest();
jsonPojoTest.setUserName("test");
System.out.println(io.github.wycst.wast.json.JSON.toJsonString(jsonPojoTest)); // 输出: {"name":"test"}
// 场景1: 将userName映射出书 user_name
JSONInstance jsonInstance = JSONInstance.create();
jsonInstance.mixinPojoField(JSONPojoTest.class, "userName", "user_name");
System.out.println(jsonInstance.toJsonString(jsonPojoTest)); // 输出: {"user_name":"test"}
// 场景2: 将userName映射出书 User_Name
JSONInstance jsonInstance2 = JSONInstance.create();
jsonInstance2.mixinPojoField(JSONPojoTest.class, "userName", "User_Name");
System.out.println(jsonInstance2.toJsonString(jsonPojoTest)); // 输出: {"User_Name":"test"}
}
}
另外实例化支持根据不通的场景设置不同的解析方法(字符串),比如在不需要关注字符串的场景下可以关闭字符串的读写输出,能大大提升效率和存储。
JSONInstance jsonInstance = JSONInstance.create();
jsonInstance.setNoneStringMode(true);
如果你的JDK环境(JDK17+)支持向量(Vector API)加速,可以设置开关启用(目前仅仅作用于字符串的读写)
jsonInstance.useStringVector()
非实体类字段映射示例
输入字符串是 {id, name,items}这样的结构,转化为 {label, value, children}
String json = "{\"id\":\"123\",\"name\":\"研发部\", \"items\": [{\"id\": \"zhangsan\", \"name\": \"张三\"}, {\"id\": \"lisi\", \"name\": \"李四\"}]}";
// 映射
final Map<String, String> mapping = new java.util.HashMap<String, String>();
mapping.put("id", "value");
mapping.put("name", "label");
mapping.put("items", "children");
Map map = (Map) JSON.parse(json, JSONMapHandler.of(mapping));
System.out.println(map); // {value=123, label=研发部, children=[{value=zhangsan, label=张三}, {value=lisi, label=李四}]}
如上使用JSONMapHandler进行映射转化,也可以自定义JSONMapHandler来按需设置键值自由,比如去掉数据中的空值(value为null),以及拼接前后缀等。
更多使用文档地址
查看 Wast 文档