alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.78k stars 494 forks source link

一次配置但能支持多个序列化场景的方式 #2975

Open henry-yuhm opened 1 month ago

henry-yuhm commented 1 month ago

后端服务完成后需要返回结果给前端时,常规的规范做法是do转换成dto,然后框架会自动序列化dto,但当同一个do在多个服务方法中需要返回不同的结构和字段时,就要多个dto来对应,以前研究过直接返回do,通过在do上定义JSONField#label来实现过,但是它只支持显式的调用toJSONString方法来实现不同服务返回不同字段,例如 场景1,需要返回字段a,但不要字段b 场景2,需要返回字段b,但不要字段a 类似这种需求,原来尝试过,字段a上加上@JSONField(label = 'a'),同理,字段b上也加 然后在场景1的服务代码最后调用return JSON.toJSONString(应该是有传入label的地方,fastjson2中找不到了) 请问在2中,label还有作用或还是这样的效果或限制吗,有没有办法不显式调用toJSONString(控制器方法返回do,由框架自动序列化)来实现这样的精简返回字段效果,谢谢

wenshao commented 1 month ago

LabelFilter还没加上,我将会在2.0.54版本中补上哈,预计在11月底才会发布新版。在此之前,你可以不同场景使用不同的filter

henry-yuhm commented 1 month ago

非常给力,感谢大神。

henry-yuhm commented 1 month ago

针对Filter,我还有个问题,原来我针对前端的查询在后端写了很多对应的类来做数据检索与返回,由于是同一类的操作,而且会有几个处理类返回的是同一类型的对象的范围,所以我就做了个稍微通用一些的dto(字段是最全的),然后我用FastjsonConfig生成了个bean,并且每个查询类也是bean,都注入了这个FastjsonConfig的bean字段,然后我在每个查询类一开始就会调用字段的过滤配置 jsonConfig.setWriterFilters( new SimplePropertyPreFilter(InversionFactoryView.class, "item", "pack", "color", "size", "model", "lot", "batch", "serialNumber", "quantity"), new SimplePropertyPreFilter(ItemView.class, "id", "no", "name"), new SimplePropertyPreFilter(PackView.class, "id", "specification", "uom", "factor"), new SimplePropertyPreFilter(LotView.class, "id", "no", "productionDate", "validUntil") ); 然后我再执行查询并构造返回对象,并走框架的序列化,这样同一类的dto在不同的查询类中可以返回不同的字段,但是一直会出现一个问题,就是同样一个查询接口,在连续调用几次后,会出现返回全字段的json,所有属性全是null的,我一度认为是FastjsonConfig在查询类中做成了bean注入,它是个共享的,其它的查询调用是不是会冲突这个setWriterFilters方法,也或者就是fastjson的bug,就是这个序列化配置的作用是请求级的,还是bean级的,前者我认为不会有问题,因为两个请求就算是调用同一接口,也会是两个序列化的内容,互相不共享的,而后者就不一定,不知道这个问题在fastjson2中是否还存在,还是我一直用错了这个序列化配置