前言:当一个以List<Model>形式的json串,想反序列化为List<Model>对象时,JFinal未提供反序列化方式,原因是已经有成熟的jar包来做这件事,例如fastjson/jackson/gson等等。
一、JFinal v2.2提供的Generator生成model、basemodel,当数据库使用驼峰命名规则,反序列化集合时,我们可以直接使用fastjson、jackson的反序列化函数:
fastjson:
JSON.parseArray(String jsonString, Class<T> class);
jackson:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.readValue(String jsonString,TypeReference<List<Model>>() {});
以上就是大概的使用方式,由于不是本文要表达的重点,不过多阐述。
二、当数据库使用下划线"_"连接命名方式时,basemodel中的getter、setter方法仍然按照驼峰命名的规则来生成,这时json中键值若继续使用数据库列名,当使用(一)中方法序列化时,我们会得到无法找到对应setter的异常。不多废话,直接上代码:
public <T extends Model<T>> List<T> parseArrayToModel(String jsonString, Class<T> type) throws Exception { List<T> list = new ArrayList<T>(); JSONArray jsonArr = JSON.parseArray(jsonString); Table table = TableMapping.me().getTable(type); for (int i = 0; i < jsonArr.size(); i++) { T model = type.newInstance(); JSONObject jsonObj = jsonArr.getJSONObject(i); for (String key : jsonObj.keySet()) { Class<?> colType = table.getColumnType(key); if (colType == null) { throw new ActiveRecordException("The model attribute " + key + " is not exists."); } try { String paraValue = jsonObj.get(key) != null ? jsonObj.getString(key) : null; Object value = paraValue != null ? OpenJFinalMethod.convert(colType, paraValue) : null; model.set(key, value); } catch (Exception e) { throw new RuntimeException("Can not convert parameter: " + key, e); } } list.add(model); } return list; }
其中OpenJFinalMethod.class为读取com.jfinal.core.TypeConverter的convert方法
public class OpenJFinalMethod { public static final Object convert(Class<?> type, String s) throws ParseException { return TypeConverter.convert(type, s); } }
使用时
MyJson.getJson().parseArrayToModel(jsonData, MyModel.class);
以上是总结的json反序列化成集合的方式,具体使用在JFinal还可以模拟JsonFactory的方式注册到Constants,自定义生成、反序列化json。