JSRUN 用代码说话

Json 转换

编辑教程

Json 转换

jfinal 的 json 模块以抽象类 Json 为核心,方便扩展第三方实现,jfinal 官方给出了三个 Json 实现,分别是 JFinalJson、FastJson、Jackson,这三个实现继承自抽象类 Json。

抽象类 Json 的核心抽象如下:

public abstract class Json {
    public abstract String toJson(Object object);
    public abstract <T> T parse(String jsonString, Class <T> type);
}

如上代码可以看出 Json 抽象就是 Object 与 json string 互转的两个方法,toJson(...)将任意 java 类型转成 json string,而 parse 将 json string 再反向转成范型指定的对象。

配置

jfinal 官方提供了 Json 抽象类的三个实现:JFinalJson、FastJson、Jackson,如果不进行配置,那么默认使用 JFinalJson 实现,指定为其它实现需要在 configConstant 进行如下配置:

public void configConstant(Constants me) {
    me.setJsonFactory(new FastJsonFactory());
}

上面配置将系统默认使用的 JFinalJson 切换到了 FastJson。还可以通过扩展 Json 抽象类以及 JsonFactory 来实现定制的 Json 实现。

假定用户扩展出了一个 MyJson 与 MyJsonFactory ,那么可以通过如下的方式切换到自己的实现上去:

public void configConstant(Constants me) {
    me.setJsonFactory(new MyJsonFactory());
}

此外,jfinal 官方还提供了 MixedJson、MixedJsonFactory 实现,这个实现让转 json string 时使用 JFinalJson,反向转成对象则使用 FastJson。

如果希望在非 web 下进行配置,需要使用 JsonManager,例如:

JsonManager.me().setDefaultJsonFactory(new MixedJsonFactory());

还可以配置 Date 类型转 json 后的格式:

public void configConstant(Constants me) {
    me.setJsonDatePattern("yyyy-MM-dd");
}

注意,在使用 MixedJsonFactory、FastJsonFactory、JacksonFactory 时需要添加其依赖,具体依赖参考下一小节内容。

四个实现

jfinal 官方默认给出了四种 json 实现:JFinalJson、FastJson、Jackson、MixedJson,可以满足绝大多数需求。

JFinalJson

JFinalJson 是 jfinal 官方最早的一个实现,这个实现最重要一点就是在转换 jfinal 的 Model 时是先获取 Model 中的 Map attrs 属性,然后再去转换这个 Map 对象。即便你的 Model 生成了 getter 方法,也不会被转换时调用。

针对 Model.attrs 属性进行转换而不是利用 getter 方法进行转换有如下几个原因:

支持多表关联查询结果的转换

无论是 Model 还是传统 Java Bean,其 getter 方法都是固定的,而多表关联查询的 sql 语句中的 select 中的字段是动态的,通常还包含关联表中的字段,而这些字段值没有相关的 getter 方法,这些字段就无法被转换

早期的 jfinal 用户没有为 Model 生成 getter 方法

注意:JFinalJson 只支持对象转 json string,不支持反向的 json string 转对象,可以通过使用 MixedJson 来支持反向转换:me.setJsonFactory(new MixedJsonFactory());

JFinal 4.9 版本对 JFinalJson 进行了彻底的重构与优化,新增了一些功能。

Model、Record 字段名转换为驼峰格式

JFinalJson.setModelAndRecordFieldNameToCamelCase();

大量开发者将数据库字段名命名成下划线的格式,如:"user_id",这就造成了与 java 变量名风格的不统一,对代码质量有一定损害。

上述配置只有在碰到下划线时才会对其进行转换,否则原样保留,而 oracle 用户习惯使用大写的字段名,所以需要使用如下配置:

JFinalJson.setModelAndRecordFieldNameConverter(fieldName -> {
    return StrKit.toCamelCase(fieldName, true);
});

上述代码中的第二个参数 true 表示将字段名转成小写字母,而无论是否出现下划线。

新增 setSkipNullValueField 配置方法

该方法用于去除 null 值字段的转换:

JFinalJson.setSkipNullValueField(true);

新增 addToJson 扩展方法

该方法可以细粒度地对任意类型的转换进行扩展:

JFinalJson.addToJson(Timestamp.class, (value, depth, ret) -> {
    ret.addLong(((Timestamp)value).getTime());
});

以上扩展代码,将 Timestamp 类型转换成 long 值。

FastJson

FastJson 是对第三方的 fastjson 进行的二次封装,该实现最重要的一点就是转换依赖于 Model、java bean 的 getter 方法。使用 fastjson 可以按照其官方文档去配置 fastjson 的各种转换参数。

使用 FastJson 封装时,需要添加其依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.68</version>
</dependency>

Jackson

该实现与 FastJson 类似,是对第三方的 jackson 的二次封装

使用 Jackson 封装时,需要添加其依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>

MixedJson

MixedJson 是对 JFinalJson、FastJson 的再一次封装,Object 转 json string 时使用 JFinalJson 的实现,而反向 json string 转 Object 使用 FastJson。

这个实现结合了 JFinalJson 与 FastJson 两者的优势。 前者不支持 json string 到 Object 的转换,后者不支持关联表 sql 查询动态字段的转换。

使用 MixedJson 封装时需要添加 FastJson 封装的依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.68</version>
</dependency>

用法

json 转换在 jfinal 中的使用分为两类用法,第一类是使用配置的 json 转换,第二类是指定某个实现进行 json 转换。

使用配置的 json 实现转换

如下代码将使用前面章节中介绍的配置的 json 实现进行转的换:

// 在 Controller 中使用 renderJson 进行 json 转换,并渲染给客户端
renderJson();
renderJson(key, object);
renderJson(new String[]{...});

// 使用 JsonKit 工具类进行 json 转换
JsonKit.toJson(...);
JsonKit.parse(...);

使用指定的 json 实现转换

如果下代码将使用指定的 json 实现去转换:

// 临时指定使用 FastJson 实现
FastJson.getJson().toJson(...);
FastJson.getJson().parse(...);

// 为 Controller.renderJson(..) 方法直接传入转换好的 json string
renderJson(FastJson.getJson().toJson(...));

上面这种用法可以临时摆脱配置的 json 实现,从而使用指定的 json 实现。

JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟