model集合的json反序列化

前言:当一个以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。

评论区

JFinal

2016-09-08 10:05

所以说,jfinal 建议 json 的 keyName 也使用驼峰方式命名,就可以直接让jfinal 2.2 生成的 Model 直接被 fastjson 与 jackson 反序列化了。上次我发给你的那个 JFinalJson 与 FastJson 结合起来的例子还在不? 感谢分享,先赞一个 ^_^

飞舞稻草

2016-09-08 14:23

@JFinal 还在的。我贴出来
public class MyJsonFactory implements IJsonFactory {
private static MyJson myJson = new MyJson();
public Json getJson() {
return myJson;
}
private static class MyJson extends Json {
private static JFinalJson jFinalJson = JFinalJson.getJson();
private static FastJson fastJson = FastJson.getJson();
public String toJson(Object object) {
return jFinalJson.toJson(object);
}
public T parse(String jsonString, Class type) {
return fastJson.parse(jsonString, type);
}
}
}

都教授

2016-10-26 16:17

@JFinal 你好,我页面显示一个(栏目树)树状图tree的样子,后台需要一个json数据json数据存在子节点,传统的是用jsonarray.add一个jsonobject,这样的方法转换到jfinal里面如何解决?

2017-09-28 20:22

不提供反序列化不是因为有成熟的,如果是这个原因序列化也不会提供,是因为反序列化后类型错误,没有哪个jar可以反序列化出正确类型,在model中不存在类型的定义,所以如果需要正确的反序列化,还是需要常规的Bean

广靓

2018-10-25 18:24

按理说以下代码可以走成功吧,但是我试了好多次,而且也换了好多反序列化方式,但是都会报错这是为什么呢? jfinal3.5 @jfinal
Test test = new Test();
test.setName("d");
test.setPassword("a");
System.out.println(test.toJson());
Test test1 = FastJson.getJson().parse(test.toJson(),Test.class);
System.out.println(test1.toJson());

热门分享

扫码入社