设为首页 加入收藏

TOP

今天,念念不忘一件事... ?在使用Fastjson-JSON#toJSONString序列化对象时,如何截取比较长的属性值串?(一)
2023-07-25 21:29:09 】 浏览:69
Tags:今天 ... Fastjson-JSON#toJSONString 何截取

项目里 前后端页面的http请求 及 dubbo服务间的RPC调用,返回值类型统一是一个 Result<T> ,其结构如下。

@Data
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 返回处理消息
     */
    private String message = "操作成功!";

    /**
     * 返回code码
     */
    private Integer code = 0;

    /**
     * 返回数据对象 data
     */
    @Getter
    private T data;
}

 

各项目间使用dubbo作RPC调用。我们在底层定义了一个公用的DubboTraceFilter。这个Filter会将项目的dubbo接口方法的请求参数和返回值打印到log文件里。其中,返回值 Result<T>对象 通过fastjson序列化。

 

背景介绍完毕。接下来说我要解决的事情。

注意到Result<T>的data字段。它是泛型T的实例,就是说,这个data会是任意类型的数据。

从log里看,当data里是集合数据,例如,分页查询的场景,打印出来的log会超级长。

这导致日志量很大,同时,这种无用的日志刷屏,也不利于我们排查问题。

 

简言之,看下面两段Result<T>对象序列化的json串(为便于阅读,进行了格式化),我希望log里出现后者这种缩减版的文本。

{
    "message": "成功",
    "code": 200,
    "data": ["0memob92142f2-ad8a-4812-913e-002f8f9d1894", "1memo77d4ad82-078f-4f73-a26e-c5302a596042", "2memoa69185c2-670d-480b-b1d2-19fd1326ecd5", "3memoee5d13a7-83bd-4430-a4b0-198e65201dc7", "4memo519d9d69-a27f-4864-8dd4-889ada1790a3", "5memo85034936-564b-41d8-94f0-ff1ac7be8d92", "6memoa22d4b20-828a-4ac5-a3fe-461283fc4154", "7memo7b2b8880-80b2-41f8-93d9-553467287e13", "8memo55afe9f2-e6b5-481c-9978-773fb5ff0f14", "9memoa5a92ffd-4e72-42f1-8d81-7221d2f371a3"],
    "timestamp": 1666961782888
}
{
    "code": 200,
    "message": "成功",
    "data": "[\"0memob92142f2-ad8a-4812-913e-002f8f9d1894\",\"1memo77d4ad82-078f-4f73-a26e-c5302a596042\",\"2memoa6...",
    "timestamp": 1666961782888
}

 

 

那么,如何解决这个痛点?

我相信,找开发组里的任何一位同学,他都能解决。改DubboTraceFilter里的代码就行了,对序列化的json串进行相关截取。

 

而我想说什么呢?

 

一劳永逸!

程序里有还有其他地方也存在通过 JSON#toJSONString(Result<T>) 打印log的代码。 难道逐个改吗?

所以,有没有简单的办法,改一处就全改了。

 

世上无易事,用心求精进。只要不放弃,办法就会有。

解决办法是 利用fastjson的两个成员 -- com.alibaba.fastjson.serializer.ObjectSerializer 和 com.alibaba.fastjson.annotation.JSONField 。

fastjson的ObjectSerializer 是fastjson的序列化器接口,相应地,ObjectDeserializer是反序列化接口。在com.alibaba.fastjson.serializer包下,有许多默认的XxxCoDoc或XxxSerializer实现,如StringCodec、ToStringSerializer、IntegerCodec、EnumSerializer等。(Codec:CoDec,Compressor Decompressor,压缩解压缩器,编码解码器) XxxCodec会同时实现 ObjectSerializer 和 ObjectDeserializer两个接口,XxxSerializer只实现ObjectSerializer接口。

 

ObjectSerializer 和 ObjectDeserializer这两个接口类的javadoc,写明了如何使用它们。

首先,通过实现ObjectSerializer接口来自定义一个序列化器 StringAbbreviatingSerializer,用以截断属性值对应的字符串。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import org.apache.commons.lang.StringUtils;

import java.io.IOException;
import java.lang.reflect.Type;

public class StringAbbreviatingSerializer implements ObjectSerializer {
    /**
     *
     * @param serializer
     * @param object field的值
     * @param fieldName field的name
     * @param fieldType field的类型,如java.lang.String
     * @param features
     * @throws IOException
     */
    @Override
    public void write(JSONSerializer serializer, Obj
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇看了我的 mybatis-plus 用法,全.. 下一篇2流高手速成记(之五):Springbo..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目