版本JFinal4.9
现有代码:
@Override
public void configConstant(Constants me) {
me.setJsonDatePattern("yyyy-MM-dd");
JFinalJson.setModelAndRecordFieldNameToCamelCase();
me.setJsonFactory(MixedJsonFactory.me());
}数据库create_time字段类型为datetime,映射的Java model已确认为java.util.Date,以下为BaseXXX的相关代码
public M setCreateTime(java.util.Date createTime) {
set("create_time", createTime);
return (M)this;
}
public java.util.Date getCreateTime() {
return get("create_time");
}现象:无论修改me.setJsonDatePattern("yyyy-MM-dd");为什么格式,返回的json字段都是yyyy-MM-dd HH:mm:ss格式
相关源码分析:
JFinalJson
@Override
@SuppressWarnings({"rawtypes", "unchecked"})
public String toJson(Object object) {
if (object == null) {
return "null";
}
JsonResult ret = TL.get();
try {
// 优先使用对象级的属性 datePattern, 然后才是全局性的 defaultDatePattern
String dp = datePattern != null ? datePattern : getDefaultDatePattern();
ret.init(dp, timestampPattern);
ToJson toJson = kit.getToJson(object);
toJson.toJson(object, convertDepth, ret);
return ret.toString();
}
finally {
ret.clear();
}
}JFinalJsonKit
if (value instanceof java.util.Date) {
if (value instanceof Timestamp) {
return new TimestampToJson();
}
if (value instanceof Time) {
return new TimeToJson();
}
return new DateToJson();
}调试:

调试发现createTime被作为Timestamp处理了,而timestampPattern的值目前无法修改,因为MixedJson.getJFinalJson()为private方法,也就没办法获取这个内部实例调用setTimestampPattern()
建议me.setJsonDatePattern("yyyy-MM-dd");的时候同时设置defaultDatePattern和timestampPattern都为这个值,这样子更常用一些,或者退而求其次开放设置JFinalJson.timestampPattern的方法,即修改MixedJson.getJFinalJson()为public方法
JFinalJson.addToJson(Timestamp.class, (v, d, ret) -> {
Timestamp t = (Timestamp)v;
String s = ret.getFormat("yyyy-MM-dd").format(t);
ret.addStrNoEscape(s);
});
由于 Json.java 中并不支持 timestampPattern 配置,所以该配置仅仅是 JFinalJson 内部使用的,所以你当前无法简单地通过配置解决问题
在你不扩展的情况下,只可以临时指令 timestampPattern,例如:
JFinalJson.getJson().setTimestampPattern(...).toJson(...);
上面的临时指定不是全局配置,需要每次都要调用一下那个 setTimestampPattern