关于fastjson:Fastjson2基础使用以及底层序列化反序列化实现探究

1 Fastjson2简介Fastjson2是Fastjson的升级版,特色: 协定反对:反对JSON/JSONB两种协定局部解析:能够应用JSONPath进行局部解析获取须要的值语言反对:Java/Kotlin场景反对:Android8+/服务端其余个性反对:Graal Native-Image、JSON Schema2 根底应用2.1 测试环境环境: JDK版本:1.8.0_341Fastjson2版本:2.0.19测试类: @Builder@Data@ToStringpublic class Entity { private String field1; private Integer field2;}2.2 JSON序列化System.out.println(JSON.toJSONString(entity));2.3 JSON反序列化System.out.println(JSON.parseObject(str,Entity.class));2.4 JSONB序列化byte[] bytes = JSONB.toBytes(entity);2.5 JSONB反序列化System.out.println(JSONB.parseObject(bytes,Entity.class));2.6 JSON SchemaJSON Schema可用于反序列化时对JSON字段进行验证应用,配置Schema能够通过@JSONField/@JSONType,这里以@JSONField为例: public class Entity { private String field1; @JSONField(schema = "{'minimum':0,'maximum':100}") private Integer field2;}测试代码: Entity entity1 = Entity.builder().field2(-1).build();Entity entity2 = Entity.builder().field2(50).build();Entity entity3 = Entity.builder().field2(101).build();String str1 = JSON.toJSONString(entity1);String str2 = JSON.toJSONString(entity2);String str3 = JSON.toJSONString(entity3);try { JSON.parseObject(str1, Entity.class);} catch (Exception e) { e.printStackTrace();}JSON.parseObject(str2, Entity.class);try { JSON.parseObject(str3, Entity.class);} catch (Exception e) { e.printStackTrace();}输入: ...

February 19, 2023 · 9 min · jiezi

关于fastjson:fastjson全局日期序列化设置导致JSONField无效

问题形容fastjson通过代码指定全局序列化返回工夫格局,导致应用JSONField注解标注属性的非凡日期返回格局生效 应用版本利用名称版本springboot2.0.0.RELEASEfastjson1.2.83全局设置代码public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { //1.须要定义一个convert转换音讯的对象; FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); //2.增加fastJson的配置信息,比方:是否要格式化返回的json数据; FastJsonConfig fastJsonConfig = new FastJsonConfig(); //全局指定了日期格局 fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); //3解决中文乱码问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); //4.在convert中增加配置信息. fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); //5.将convert增加到converters当中. converters.add(fastJsonHttpMessageConverter); }}属性设置代码 @JSONField(format = "yyyy-MM-dd") private Date addDate;返回后果申请接口后addDate字段返回的格局为2022-12-17 13:26:45,依然为全局日期格局,并不设置JSONField后冀望的2022-12-17格局 解决方案对立扫描系统启动时扫描对应基类的子类,通过反射获取标注了JSONField注解的字段并获取对应的format值 public class FastJsonUtil { private static HashMap<String, String> dateMap = new HashMap(); public static void scanDate2Json(Class runtimeClass, List<String> extraPackageNameList) { List<Class> filterClassList = new ArrayList<>(); filterClassList.add(BaseSystemObject.class); List<Class<?>> scanClassList = new ArrayList<>(); if (!runtimeClass.getPackage().getName().equals(Application.class.getPackage().getName())) { scanClassList.addAll(ScanUtil.getAllClassByPackageName(runtimeClass.getPackage(), filterClassList)); } for (String packageName : extraPackageNameList) { scanClassList.addAll(ScanUtil.getAllClassByPackageName(packageName, filterClassList)); } for (Class clazz : scanClassList) { List<Field> fs = Arrays.asList(clazz.getDeclaredFields()); for (Field field : fs) { field.setAccessible(true); if (field.getType() == Date.class) { JSONField jsonField = field.getAnnotation(JSONField.class); if (jsonField != null && !StringUtil.isEmpty(jsonField.format())) { dateMap.put(clazz.getName() + "|" + field.getName(), jsonField.format()); } } } } } public static boolean checkDate2Json(String key){ return dateMap.containsKey(key); } public static String getDate2JsonFormat(String key){ return dateMap.get(key); }}对立批改实现fastjson的扩大过滤器ValueFilter进行序列化后的值批改,并注册到配置中去 ...

December 17, 2022 · 2 min · jiezi

关于fastjson:Fastjson关于is开头序列化问题

问题形容public class Demo { private Boolean isHot; private Boolean isQuick; public Boolean getHot() { return isHot; } public void setHot(Boolean hot) { isHot = hot; } public Boolean getQuick() { return isQuick; } public void setQuick(Boolean quick) { isQuick = quick; }}例如下面一个bean,getset办法均为idea主动生成的(Idea 2020.1),Fastjson序列化后的后果为 {    "hot":true,    "quick":true}咱们其实冀望的是 {    "isHot":true,    "isQuick":true}解决方案计划一批改get办法为getIsXXXpublic Boolean getHot() ->public Boolean getIsHot() 计划二去掉getset办法应用lombok,如果公司容许的话 计划三批改idea默认模板 #set($paramName = $helper.getParamName($field, $project))#if($field.modifierStatic)static ###end$field.type ###set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))#if ($field.name == $paramName)get###elsegetIs###end${name}() {return this.##$field.name;}计划四不要以is结尾,退出公司的代码标准,《Java开发手册(泰山版)》中也提到了 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则局部框架解析会引起序列 化谬误。 ...

December 14, 2021 · 3 min · jiezi

关于fastjson:fastjson内存泄漏解决办法-springboot实战电商项目mall4j

springboot实战电商我的项目mall4j (https://gitee.com/gz-yami/mall4j) java开源商城零碎 环境:jdk1.8 零碎:window/linux fastjson版本:1.2.29 要害代码: public class FastJsonUtil { /* * 将 pojo 对象转为 json 字符串,并且驼峰命名批改为下划线命名 */ public static String buildData(Object bean) { try { SerializeConfig config = new SerializeConfig(); config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase; return JSON.toJSONString(bean, config); } catch (Exception e) { return null; } }}// 随便的一个实体类public class T { public String userName; public String userArg; public String userGender; public String userAddr; public T(String userName, String userArg, String userGender, String userAddr) { this.userName = userName; this.userArg = userArg; this.userGender = userGender; this.userAddr = userAddr; }}模仿并发 (也能够应用 JMeter) ...

May 11, 2021 · 2 min · jiezi