RenderJson之后 出现很多null属性

1 JSONObject jobj = new JSONObject();

2 jobj.put("option", JSON.toJSON(opt));

3 System.out.println(jobj);

4 this.renderJson(jobj);

第三行打印的内容是,我们看到这个opt对象中的值为null的属性是都忽略的了;

QQ截图20170302105601.png

前台查看response得到的却是:这个opt对象中的所有对象却都出现了!

前后台打印内容不一致了!!什么原因?

renderJson的时候是不是得有个 参数 是否忽略null值属性?


QQ图片20170302105646.png



评论区

lyh061619

2017-03-02 11:32

怎么感觉你做一两次Json转换呢?既然第2步已经做json转换了, 第4步感觉多余了,你改第4步为renderText()试下。

lyh061619

2017-03-02 11:32

这样输出的结果肯定跟你第3步在控制台打印的效果一样。

Terely

2017-03-02 11:50

@lyh061619 renderText只能放入string类型的,我这里是对象!之所以要new 一个 jsonObject 是因为要放入多个,这里只是jobj放了一个option,我还有rows等其他对象要放入一起renderJson到前台

lyh061619

2017-03-02 11:52

toString下不就得了嘛

JFinal

2017-03-02 12:34

既然都已经转换成了 json 了,直接这样就好: renderJson(JSON.toJSON(opt));

Terely

2017-03-02 12:43

@JFinal 试过了你这样也是不行!前台收到的还是带有一大堆这个opt打印中没有的那么多的值为null的属性。如果是使用 JSON.toJSONString(opt); 这样是可以的!后台打印的东西,前台也获得是一致的。
我理解的是,renderJson的时候是不是会去找这个对象,然后进行对对象中所有的成员属性进行转换,而不是直接处理解析传入的json对象!所以我得把他转成字符串,这样renderJson就不知道是什么对象,就当普通字符串处理传递到前台了?

Terely

2017-03-02 14:52

@JFinal 经过实验得到了一个结论!
renderJson(object);
这个object里面如果是JFinal 的 model 那么就会是空
如果是自己创建的一个普通java类,那么就会把这个类中所有的属性和属性值作为null传给前台;

Terely

2017-03-02 15:03

@JFinal 这是赤果果 的 java 类 歧视啊!
详细说明一下。jfinal版本3.0
简单的例子:其中Menu 是继承 jfinal Model的 模型类,People类是 自己建立的一个最简单的普通java对象 带有getset方法;
Menu m = new Menu();
People p = new People();
都没有任何的赋值操作,分别执行下面的方法
renderJson(m);和 renderJson(p);的时候
前台页面得到的是两种结果
{}和{"sex":null,"address":null,"age":null,"name":null}
这让我感到很彷徨!

Terely

2017-03-02 15:04

Terely

2017-03-02 16:09

问题解决:
解决办法:
在config中 设置me.setJsonFactory(new FastJsonFactory());//因为我用的是fastjson
原因:1. jfinal renderJson 默认会使用 自己的 JFinalJsonKit 来处理 不会忽略掉null;而fastjson 会忽略掉,所以这里要使用一致的json工具来处理json 很重要
2.为什么继承自model的类不会有null?因为它就没有属性是一个空类,当然啥都没有。
另外:
JFinalJsonFactory 不支持 Record 的 json 转换
波总建议的使用: me.setJsonFactory(new MixedJsonFactory());
回复为啥不支持上传图片?!
@JFinal 还有没有其他补充

JFinal

2017-03-02 16:14

@Terely 感谢你在解决问题后再回来分享

Terely

2017-03-02 17:21

还有一点:
上面说了 renderJson 默认是使用jfinalJson处理,是可以进行Record 的 json的转换,但是fastjson 不支持(使用fastjson进行Record的 rederJson 得到的大约是这样的数据:{"columnNames":[],"columnValues":[],"columns":[]})
虽说可以使用MixedJsonFactory 在进行 parse和tojson的时候使用不同的方式,
但是如果遇到返回前台的数据中有多重类型形势,有我们自定义的普通java类(就是不想要null值的属性的对象),也有查询出来的Record的list等,怎么办呢?
解决方案一:
完整代码:
Page page = Db.paginate。。。。。。。。。。。。。。

Map result = new HashMap();
result.put("rows", JSON.parse(JFinalJson.getJson().toJson(page.getList())));
result.put("total",page.getTotalRow());
result.put("people", people);
this.renderJson(result);

设置默认的json使用fastJson:
me.setJsonFactory(new FastJsonFactory());
代码里对于Recored 的list进行两次转换如:
JSON.parse(JFinalJson.getJson().toJson(page.getList()))
就是先用JfinalJson 把Record转换成字符串,再用fastJson转换成json对象
最后使用 renderJson(obj);
反正这样我是成功了

感觉不是最好的解决办法!最好的办法就是 JfinalJson中有方法可以进行
JFinalJson.toJson(obj,boolean);//true 忽略掉null
this.renderJson(result,true);

这貌似需要修改源码了!



@JFinal 波总还有什么高见?

JFinal

2017-03-02 20:29

@Terely 一般情况下,model 中也没有什么 null 值,如果设计表的时候不允许字段值为 null 的话,这种情况就更少,退一步讲,如果有 null 值,这也没什么错,所以一直以来也没有人反馈过这个问题

站在我个人的角度来说,是这么做的:
1:所有 model 用生成器生成了 getter 、setter,这样可以支持 json 的反向序列化
2:model 的 getter、setter 方法中不放任何逻辑,只是属性的读与写而已,保障了 JFinalJson 与 Fastjson 对其转换时的一致性
3:使用me.setJsonFactory(new MixedJsonFactory()),这样可以支持 Record 转 json
4:数据表的字段名直接使用驼峰命名,在 Record 转 json 时的属性名与 model 转 json 保持一致

通过上面的做法,在实践中并没有碰到过类似于 null 值的问题。如果万一碰到了并且很纠结,还可以使用 model.removeNullValueAttrs() 一次性去除所有 null 值属性

xqh

2019-03-10 10:30

@JFinal 但我需要Null也输出到前台。主要是前台要有一个稳定的JSON结构,不会因为值为Null而没有这个Json节点

jiren

2020-08-12 06:02

总结一下问题应该是,
1. 有的人希望, 当bean里面没有值的时候, 直接不输出到前台, 隐藏这个字段,
2. 有人希望, 即使这个字段为空, 也应该返回前台, 保证完整的节点结构,
jfinal默认的是第二种, 当user对象里面name为null的时候 会返回, 而fastjson默认返回就是对象user没有这个字段

steven_lhcb_9527

2021-08-23 11:27

属性值为null,可以转为空字符串吗?因为在ios调用接口时,null值会变成"null"这样的形式

热门反馈

扫码入社