一种在json场景针对pojo对象动态添加扁平属性的方法

本方法在几年前均已实现,这里将其重新整理一下,以作备忘
在典型的应用场景中,经常会有这样的需求,即当业务返回单个pojo对象时,需要临时追加几个属性在这个对象中并一起返回至前端。如下例子所示:

public class Abc {
    String username;
}

此对象仅有1个属性,但返回至前端时,需要返回类似如下的数据结构:

{
    "username": "张三",
    "sex": "MALE",
    "age": 20
}

有一些作法通过再定义新的类,如 AbcVO 通过继承原类并添加新字段来支持;或者不再使用对象,则是直接使用map代替. 前者会造成类爆炸,后者会造成API语义不清晰.

本文描述了一种标准的 Attr 接口结构,并通过json序列化器(如jackson或fastjson)支持的注解,通过简单的default 方法定义,完成属性添加。并同时支持序列化和反序列化的应用场景.

这里采用接口,以及default 方法设计,原有的类通过一个简单的额外implements,即可支持此特性,无需其它的改造,也不需要额外实现接口方法,即可使用此特性.

继续阅读“一种在json场景针对pojo对象动态添加扁平属性的方法”

Jackson中基于上下文拦截属性输出的两种实现方式

需求如下,在一个类中,有一些字段属性,其是否输出并不是由字段上的JsonIgnore来决定,而是根据从上下文(如request)中传递过来的某些参数决定。如下类:

class A {
    @ContextIgnored("field1")
    private String field1;

    @ContextIgnored("field2")
    private String field2;
}

当上下文值为 field1 时,则表示 A 的最终输出json 中没有字段 field1. 当上下文为 field2 时, 则最终输出没有字段 field2. 其它情况则输出所有字段。

本文讨论Jackson中的处理方式,如果使用 Fastjson,则有很多方式处理,这里不表.

本文描述通过利用 JsonIgnore 注解处理方式解决此问题 和 通过 PropertyFilter 两种方式来完成此需求的处理方式。

继续阅读“Jackson中基于上下文拦截属性输出的两种实现方式”

开发可正确序列化和反序列化的guava table组件

首先,什么是Table,可以理解为前端使用的html table组件,它具有行头,列头,以及具体的数据.即描述有多少行,多少列,在行为X,列为Y的二维格子中所对应的值是多少.

在使用google guava组件同时,也在讨论其组件的一些局限性,比如它的不变性,对序列化支持的不友好等.
其中table就是一个例子,作为一个表格组件的后端对应数据结构,其自带的table实现完全不能满足实际的需要.其大部分实现都是不可变的,即意味着必须要使用类似builder的模式来进行创建,一旦创建好之后,就不能再次修改.那么,作为一个实际可用的table实现,它需要哪些特性呢.以下例出我们所需要的要求:

1. 查找 按行,按列,快速定位
2. 快速迭代,按行,按列,支持稀疏迭代
3. 泛型支持(通用化)
4. 支持排序
5. 行,列动态增长,削减
6. 反序列化支持(json)

也就是说,我们期望像使用java的集合一样,创建出相应的数据之后,一直都是可变的,并且可以随意地进行传递,然后再任意地进行处理.无论按行,按列,都能够很好地使用.
本篇即描述了如何实现这样一个table组件,以及它最终的效果.

已实现的github地址:https://github.com/flym/array-tree-table

继续阅读“开发可正确序列化和反序列化的guava table组件”