JFinalのModelによるjson逆シーケンス化


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を使用した具体的なコード実装です.
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;
	}

私のレベルは限られていて、コードが不適切で優雅ではないかもしれませんが、レンガを撮らないで、アドバイスをたくさんしてほしいです.