fastjson 在使用@JSONField自定义序列化时,如何获取当前字段所属的类,

kxeu7u2r  于 2021-11-27  发布在  Java
关注(0)|答案(6)|浏览(587)

举例:

class A {
@JSONField(serializeUsing = ExampleSerializer.class)
@UserDefineAnnotation(serializeField = {"id","name"})
pirvate B b;
}

class ExampleSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
          //在此如何获取field所属的类的类型,不是字段类型。
         // 此处 JSONSerializer 中SeriaContext为空
    }
}

希望温少能看见,如果能获取到所属类就能干很多事情了。
例如:
在上例中字段B上有一个自定义注解,注解上注明了在序列化B时,需要序列化的字段,而不是直接序列化整个对象。

zpjtge22

zpjtge221#

我理解你的意思是,A的一个示例a,a.b实际上是BB类型,通过字段类型只能拿到B类型。
你现在想拿到BB类型,很简单:
直接反射a的field对象拿到b,然后拿b.class即可。

bybem2ql

bybem2ql2#

@kimmking 这里的问题就是无法拿到A类型,要做到通用,不能通过固定的类名来反射。

gudnpqoy

gudnpqoy3#

@kimmking 目的是要能够拿到A类型,反射出来拿到reflect Field b,再获取@UserDefineAnnotation中写的字段名,达到序列化指定字段的目的。

ckocjqey

ckocjqey4#

@wenshao@kimmking 请问能不能在@JsonField中扩展一个功能,处理在一对多和多对多的情况下,过滤不需要的字段。

wnavrhmk

wnavrhmk5#

这种通用性改动对api有侵入性,会影响所有已经用了这种api的代码。

建议自己按照需要的类型,单独处理。

这样需要你把annotation写到类型上,而不是field上;
或者直接不要annotation,代码里判断。

cxfofazt

cxfofazt6#

@kimmking jackson @JsonSerialize自定义序列化中 JsonGenerator.getOutPutContext返回的就是当前序列化的类型,而不是字段类型。所以如果fastjson自定义序列化write方法中的JsonSerializer能带上上下文信息,对于扩展性就很有帮助。

相关问题