seaswalker / posts

0 stars 0 forks source link

Fast json自定义编码/解码器 #12

Open seaswalker opened 3 years ago

seaswalker commented 3 years ago

编码器, 下面示例是加入实体类(要转换成json的类)的定义如下:

public class Entity {
    private IntEnum field;
}

public enum IntEnum {
    INIT(0);
    private final int status;
    IntEnum(int status) {
        this.status = status;
    }
    public int getStatus() {
        return status;
    }
}

虽然字段类型是IntEnum,但是想让最后生成的是intstatus数值,那么可以自定义编码器:

public class StatueCodec implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) {
        serializer.write(((IntEnum) object).getStatus());
    }
}

同样,如果反过来,前端传过来int,但是接收参数的字段写的是IntEnum,此时可以自定义解码器:

public class DataTypeCodec implements ObjectDeserializer {
    @Override
    @SuppressWarnings("unchecked")
    public DataTypeEnum deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        Integer t = parser.parseObject(int.class);
        return DataTypeEnum.fromType(t);
    }
    @Override
    public int getFastMatchToken() {
        return JSONToken.LITERAL_INT;
    }
}