JFinalのModelによるjson逆シーケンス化
2720 ワード
JFinalを使用して開発する場合、Modelがjsonのシーケンス化と逆シーケンス化を行うという問題を解決する必要があるかもしれません.
公式にはシーケンス化の方法が提供されていますtoJson()はとても便利で、逆シーケンス化は自分で実現しなければなりません.
以前はModelをシーケンス化したjson文字列を逆シーケンス化してmapにしてからModelを呼び出していました.setAttrs(map).これでタイプ変換の問題があり、最後に逆シーケンス化して得られたModelは、元の日付タイプが文字列になり、LongがIntegerタイプになる可能性があり、getLong()とgetDate()を呼び出すとエラーが報告されます.したがって、属性タイプの正確な変換は、逆シーケンス化で行う必要があります.Table Mappingを通ります.me().getTable(modelClass)は、modelに対応するTableを得ることができる.tableにはcolumnTypeMapメンバー変数があり、カラム名とタイプのマッピングです.この特性を利用すれば正確な変換が可能になる.
次は、fastjsonを使用した具体的なコード実装です.
私のレベルは限られていて、コードが不適切で優雅ではないかもしれませんが、レンガを撮らないで、アドバイスをたくさんしてほしいです.
公式にはシーケンス化の方法が提供されていますtoJson()はとても便利で、逆シーケンス化は自分で実現しなければなりません.
以前はModelをシーケンス化したjson文字列を逆シーケンス化してmapにしてからModelを呼び出していました.setAttrs(map).これでタイプ変換の問題があり、最後に逆シーケンス化して得られたModelは、元の日付タイプが文字列になり、LongがIntegerタイプになる可能性があり、getLong()とgetDate()を呼び出すとエラーが報告されます.したがって、属性タイプの正確な変換は、逆シーケンス化で行う必要があります.Table Mappingを通ります.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;
}
私のレベルは限られていて、コードが不適切で優雅ではないかもしれませんが、レンガを撮らないで、アドバイスをたくさんしてほしいです.