JFinal的Model进行json反序列化

Stella981
• 阅读 993

在使用JFinal进行开发时,我们可能会需要解决这样的问题:Model进行json的序列化与反序列化。

官方已经提供了序列化的方法Model.toJson()非常方便,反序列化就得自己实现一下了。

之前我一直都是把Model序列化成的json字符串,反序列化成map,然后再调用Model.setAttrs(map)。这样就有类型转换问题,最后反序列化得到的Model,原本的日期类型成了字符串,Long可能会成为Integer类型,再调用getLong()和getDate()就会报错。所以,必须要在反序列化进行属性类型的精确转换。通过TableMapping.me().getTable(modelClass) 可以得到model对应的Table;table有个columnTypeMap成员变量,是列名和类型的映射;利用这个特性就可以实现精确转换了。

下面是具体代码实现,使用了fastjson:

public static <T> T jsonToModel(String str, Class<? extends Model<?>> clazz) {
        // 使用fastjson先反序列化成json对象
        JSONObject json = JSON.parseObject(str);
        // 获取table
        Table table = TableMapping.me().getTable(clazz);
        // 得到属性类型的map
        Map<String, Class<?>> typeMap = table.getColumnTypeMap();
        Model<?> model = null;
        try {
            model = clazz.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        Set<Entry<String, Class<?>>> enterSet = typeMap.entrySet();
        for (Entry<String, Class<?>> entry : enterSet) {
            String attr = entry.getKey();
            Class<?> type = entry.getValue();
            if (Short.class.equals(type)) {
                // 短整型
                model.set(attr, json.getShort(attr));
            } else if (Integer.class.equals(type)) {
                // 整型
                model.set(attr, json.getInteger(attr));
            } else if (Long.class.equals(type)) {
                // 长整型
                model.set(attr, json.getLong(attr));
            } else if (Float.class.equals(type)) {
                // 浮点型
                model.set(attr, json.getFloat(attr));
            } else if (Double.class.equals(type)) {
                // 双精度浮点型
                model.set(attr, json.getDouble(attr));
            } else if (BigDecimal.class.equals(type)) {
                // big decimal
                model.set(attr, json.getBigDecimal(attr));
            } else if (String.class.equals(type)) {
                // 字符串
                model.set(attr, json.getString(attr));
            } else if (java.sql.Date.class.equals(type)) {
                // 年月日的日期类型
                Date date = json.getDate(attr);
                model.set(attr,
                        date == null ? null : new java.sql.Date(date.getTime()));
            } else if (Time.class.equals(type)) {
                // 年月日的日期类型
                Date date = json.getDate(attr);
                model.set(attr, date == null ? null : new Time(date.getTime()));

            } else if (Timestamp.class.equals(type)) {
                // 时间戮
                Date date = json.getDate(attr);
                model.set(attr,
                        date == null ? null : new Timestamp(date.getTime()));
            } else if (Boolean.class.equals(type)) {
                // 布尔型
                model.set(attr, json.getBoolean(attr));
            }
            // 其它的忽略,可能还有字节数组类型
            // 具体model的属性可能有哪些类型可以参考 TableBuilder.doBuild()代码

        }

        return (T) model;
    }

本人水平有限,可能代码有不妥不优雅之处,希望各位不要拍砖,多提点建议。

点赞
收藏
评论区
推荐文章
好买-葡萄 好买-葡萄
3年前
解决Redis序列化Java8的LocalDateTime问题
在从Redis获取带有LocalDateTime类型属性的对象时,产生序列化和反序列化问题解决办法方式一:实体类上指定LocalDateTime的序列化器和反序列化器@JsonDeserialize(usingLocalDateTimeDeserializer.class)//反序列化@JsonSerialize(usingLocalDa
红烧土豆泥 红烧土豆泥
3年前
解决Redis序列化Java8的LocalDateTime问题
在从Redis获取带有LocalDateTime类型属性的对象时,产生序列化和反序列化问题解决办法方式一:实体类上指定LocalDateTime的序列化器和反序列化器java@JsonDeserialize(usingLocalDateTimeDeserializer.class)//反序列化@JsonSerialize(usingLo
Stella981 Stella981
3年前
C# JToken类的使用,实现解析动态json数据、遍历、查找
在原来解析json数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的json数据,这种方法就不使用。为了解决动态解析json数据,微软有个Newtonsoft.Json封装类十分好用,里面的JToken直接实现ling查询。将json字符串解析为JToken,
Stella981 Stella981
3年前
Ajax和SpringMVC之间JSON交互
Ajax和SpringMVC之间的json数据传输有两种方式:1.直接传输Json对象2.将Json序列化成json字符串1.直接传输Json对象前端Ajax$(document).ready(function(){$("btn_login").click(function(){
Stella981 Stella981
3年前
Django 前台通过json 取出后台数据
前台通过json取出后台数据步骤1:后台数据通过JSON序列化成字符串注意:1、json是1个字符串     2、通过json.dumps('xxx')序列化成1个字符串的 '字典对象' views.pydefajax(request):ifrequest.
Stella981 Stella981
3年前
AspNetCore Json序列化设置
AspNetCore中的Json序列化处理已经默认使用_Newtonsoft.Json_库了...比如像MVC中:publicI不过使用过程中会发现一些问题,其实这算默认设置吧:Json序列化后的字段格式会变成小驼峰形式Json序列化时的日期时间格式化没有处理循环引用的问题,比如EntityF
Wesley13 Wesley13
3年前
Go 中 JSON 的序列化和反序列化
golang中对json的序列化/反序列化操作还是比较容易的,序列化操作主要是通过encoding/json包的Marshal()方法来实现,反序列化操作主要是通过encoding/json包的Unmarshal()方法来实现.//JSON序列化和反序列化//可用在api序列化输出//转成
Wesley13 Wesley13
3年前
unity序列化
什么是序列化unity的序列化在unity的开发中起着举重足轻的地位,许多核心的功能都是基于序列化和反序列化来实现的。序列化简单来讲就是就是将我们所要保存的数据进行二进制存储,然后当我们需要的时候,在读取二进制文件,反序列化回来。下面是一些常用的序列化的例子:存储脚本化的数据。在我们的c代码中,可以将我们所
Wesley13 Wesley13
3年前
Java对象转换的思考
对象转换本文将介绍对象转换,在JavaWeb开发中我们经常需要对各类对象进行转换(DB对象,DTO,VO等等).目前解决对象转换的形式有1.JSON序列化反序列化,存在的问题字段名称需要一样2.BeanUtils.copyProperties,存在的问题字段名称需要一
Stella981 Stella981
3年前
FastJson 反序列化注意事项
问题描述使用fastJson对json字符串进行反序列化时,有几个点需要注意一下:反序列化内部类反序列化模板类0\.Getter/Setter问题如我们希望返回的一个json串为"name":"name","isDeleted":true,"isEmpty":1