JFinalJsonFactory renderJson转换问题

1、json配置

me.setJsonFactory(JFinalJsonFactory.me())

2、因为我的代码器引用了tableMeta这个对象,所以直接返回了tableMeta的list集合

但是在renderJson的时候没有把这个对象转换成json格式,导致前端解析出错,

FastJsonFactory就可以,但是FastJsonFactory会把那些值为null的key给过滤掉了,有一些特殊的地方就不能正常使用

image.png

renderJson返回结果:

image.png

我看了一下这个类没有get、set方法,是不是这个原因呢?

image.png

评论区

JFinal

2020-06-08 14:48

JFinalJson 转换时依的是 getter 方法,如果被转换的类是 Model、Record , 则依赖的是内部的 Map attrs、Map columns

而 FastJson 转换依赖的是 getter 方法,还依赖 public 属性

而你当前碰到的情况是类中没有 getter 方法,所以 JFinalJson 是不能使用的

至于使用 fastjson 时碰到的 null 值被过滤的问题,可以配置 fastjson,网上搜一下很多

琴海森林

2020-06-08 15:57

明白,后续JFinalJson是否也考虑支持public属性转换

JFinal

2020-06-08 16:01

@琴海森林 可以通过 JFinalJson.addToJson(...) 自己扩展

由于这个需求并不是太多,官方默认也就不提供这个功能了,而且对性能也有所损耗

琴海森林

2020-06-08 16:07

这中情况是很少见,自己写的类可以很容易解决,

为啥tableMeta这个类没有用getter、setter方法呢?是出于什么考虑的

JFinal

2020-06-08 16:16

@琴海森林 其实就是为了省代码,这个 TableMeta 当时认为只是 jfinal 内部使用

琴海森林

2020-06-08 16:28

@JFinal 按照波总的风格,能省则省,我也是把内部模板拿出来用了,哈哈哈

List tableMetas=(List) queryTablesList(record).getList();

String template = "/com/jfinal/plugin/activerecord/generator/base_model_template.jf";
Kv data = Kv.by("baseModelPackageName", baseModelPackageName);
data.set("generateChainSetter", true);
data.set("tableMeta", tableMetas.get(0));
String content=engine.getTemplate(template).renderToString(data);