JFinalJson序列化有bug?

JFinal中有个 Ret 继承HashMap,它没有自己的字段。

  public class Result extends HashMap{

private static final long serialVersionUID = 1L;

//状态码

private Integer code = ErrorCodeEnum.OK.getCode();

//后端传给前端的“消息提示”,理论上,前端需要根据状态码code,自己维护给用户的“消息提示”

private String msg;

//数据,可以自定义bean

private Object data;

我自己一直喜欢有自己的Result,不继承HashMap,特点是 所有的数据,统一放在Object data中,只有1个字段有数据。

缺点是,如果有2个数据,就需要手动定义1个bean,来容纳这2个。


看了Ret的定义,觉得继承HashMap,也有方便的地方,就参考Ret做了点改造。


最终序列化的时候,前台的json数据是{},但code 肯定有值。


最终查看底层的序列化代码:

如果是Map类型,就强制转换为 Map,但Result除了是个Map,还有自己的字段。


public String toJson(Object object) {

return toJson(object, convertDepth);

}

protected String toJson(Object value, int depth) {

if(value instanceof Map) {

return mapToJson((Map)value, depth);

}

}

bug就这么出现了。

------------------------

从个人代码设计角度,倾向于 数据结构的单一化,要么是个纯粹的Map,要么是个 普通的Bean。

要不然就很容易出现 这种bug,职责不单一导致的。

评论区

fansunion

2018-09-11 17:47

目前解决了,按照 单一职责来,避免不必要的 bug,疑惑,纠结。
用setCode的值,存储到父类Map里。


public class Result extends HashMap{
private static final long serialVersionUID = 1L;
//状态码
//private Integer code = ErrorCodeEnum.OK.getCode();
//后端传给前端的“消息提示”,理论上,前端需要根据状态码code,自己维护给用户的“消息提示”
//private String msg;
//数据,可以自定义bean
//private Object data;

public Integer getCode() {
return (Integer) super.get("code");
}
public Result setCode(Integer code) {
super.put("code", code);
return this;
}

而不是定义单独的code字段。
public Result setCode(Integer code) {
this.code=code;
return this;
}
public Integer getCode() {
return code;
}

JFinal

2018-09-12 14:24

这个决不是 bug, JFinalJson 被设计成为继承 Map 的类只处理其 map 中的数据,否则性能会很差

fansunion

2018-09-12 16:50

@JFinal 了解了。

热门反馈

扫码入社