关于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

为什么强烈禁止开发人员使用isSuccess作为变量名

在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。 关于这个"本次请求是否成功"的字段的定义,其实是有很多种讲究和坑的,稍有不慎就会掉入坑里,作者在很久之前就遇到过类似的问题,本文就来围绕这个简单分析一下。到底该如何定一个布尔类型的成员变量。 一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量: boolean successboolean isSuccessBoolean successBoolean isSuccess以上四种定义形式,你日常开发中最常用的是哪种呢?到底哪一种才是正确的使用姿势呢? 通过观察我们可以发现,前两种和后两种的主要区别是变量的类型不同,前者使用的是boolean,后者使用的是Boolean。 另外,第一种和第三种在定义变量的时候,变量命名是success,而另外两种使用isSuccess来命名的。 首先,我们来分析一下,到底应该是用success来命名,还是使用isSuccess更好一点。 success 还是 isSuccess到底应该是用success还是isSuccess来给变量命名呢?从语义上面来讲,两种命名方式都可以讲的通,并且也都没有歧义。那么还有什么原则可以参考来让我们做选择呢。 在阿里巴巴Java开发手册中关于这一点,有过一个『强制性』规定:  那么,为什么会有这样的规定呢?我们看一下POJO中布尔类型变量不同的命名有什么区别吧。 class Model1 { private Boolean isSuccess; public void setSuccess(Boolean success) { isSuccess = success; } public Boolean getSuccess() { return isSuccess; } }class Model2 { private Boolean success; public Boolean getSuccess() { return success; } public void setSuccess(Boolean success) { this.success = success; }}class Model3 { private boolean isSuccess; public boolean isSuccess() { return isSuccess; } public void setSuccess(boolean success) { isSuccess = success; }}class Model4 { private boolean success; public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; }}以上代码的setter/getter是使用Intellij IDEA自动生成的,仔细观察以上代码,你会发现以下规律: ...

May 8, 2019 · 3 min · jiezi

Fastjson的基本使用方法大全

fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果说明比gson快大约6倍下面将讲解所有大部分fastjson用法和转换:1,Fastjson中的经常调用的方法: public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合 public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。2,Fastjson字符串转List<Map<String,Object>>(), 或者List<String>()的用法;List<Map<String, Object>> list = JSONObject.parseObject(respJson, new TypeReference<List<Map<String, Object>>>() {});3,Fastjson的SerializerFeature序列化属性QuoteFieldNames———-输出key时是否使用双引号,默认为trueWriteMapNullValue——–是否输出值为null的字段,默认为falseWriteNullNumberAsZero—-数值字段如果为null,输出为0,而非nullWriteNullListAsEmpty—–List字段如果为null,输出为[],而非nullWriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非nullWriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null例如:JSON.toJSONString(resultMap, SerializerFeature.WriteMapNullValue); ...

February 18, 2019 · 1 min · jiezi