Browse Source

添加 setToJsonFactory(...)

James 5 years ago
parent
commit
33bc99059d

+ 20 - 0
src/main/java/com/jfinal/json/JFinalJson.java

@@ -154,6 +154,26 @@ public class JFinalJson extends Json {
 		JFinalJsonKit.setModelAndRecordFieldNameToCamelCase();
 		JFinalJsonKit.setModelAndRecordFieldNameToCamelCase();
 	}
 	}
 	
 	
+	/**
+	 * 配置 ToJsonFactory,便于接管 ToJson 对象的创建
+	 * 
+	 * <pre>
+	 * 例子:
+	 *    JFinalJson.setToJsonFactory(value -> {
+	 *        if (value instanceof Model) {
+	 *            // 返回 MyModelToJson 接管对于 Model 类型的转换
+	 *            return new MyModelToJson();
+	 *        } else {
+	 *            // 返回 null 时将使用系统默认的转换类
+	 *            return null;
+	 *        }
+	 *	  });
+	 * </pre>
+	 */
+	public static void setToJsonFactory(Function<Object, ToJson<?>> toJsonFactory) {
+		JFinalJsonKit.setToJsonFactory(toJsonFactory);
+	}
+	
 	public <T> T parse(String jsonString, Class<T> type) {
 	public <T> T parse(String jsonString, Class<T> type) {
 		throw new RuntimeException("jfinal " + com.jfinal.core.Const.JFINAL_VERSION + 
 		throw new RuntimeException("jfinal " + com.jfinal.core.Const.JFINAL_VERSION + 
 		"默认 json 实现暂不支持 json 到 object 的转换,建议使用 active recrord 的 Generator 生成 base model," +
 		"默认 json 实现暂不支持 json 到 object 的转换,建议使用 active recrord 的 Generator 生成 base model," +

+ 14 - 0
src/main/java/com/jfinal/json/JFinalJsonKit.java

@@ -58,6 +58,8 @@ public class JFinalJsonKit {
 	// 对 Model 和 Record 的字段名进行转换的函数。例如转成驼峰形式对 oracle 支持更友好
 	// 对 Model 和 Record 的字段名进行转换的函数。例如转成驼峰形式对 oracle 支持更友好
 	protected static Function<String, String> modelAndRecordFieldNameConverter = null;
 	protected static Function<String, String> modelAndRecordFieldNameConverter = null;
 	
 	
+	protected static Function<Object, ToJson<?>> toJsonFactory = null;
+	
 	public interface ToJson<T> {
 	public interface ToJson<T> {
 		void toJson(T value, int depth, JsonResult ret);
 		void toJson(T value, int depth, JsonResult ret);
 	}
 	}
@@ -92,6 +94,14 @@ public class JFinalJsonKit {
 	}
 	}
 	
 	
 	protected ToJson<?> createToJson(Object value) {
 	protected ToJson<?> createToJson(Object value) {
+		// 优先使用 toJsonFactory 创建 ToJson 实例,方便用户优先接管 ToJson 转换器的创建
+		if (toJsonFactory != null) {
+			ToJson<?> tj = toJsonFactory.apply(value);
+			if (tj != null) {
+				return tj;
+			}
+		}
+		
 		// 基础类型 -----------------------------------------
 		// 基础类型 -----------------------------------------
 		if (value instanceof String) {
 		if (value instanceof String) {
 			return new StrToJson();
 			return new StrToJson();
@@ -763,6 +773,10 @@ public class JFinalJsonKit {
 			return StrKit.toCamelCase(fieldName, true);
 			return StrKit.toCamelCase(fieldName, true);
 		};
 		};
 	}
 	}
+	
+	public static void setToJsonFactory(Function<Object, ToJson<?>> toJsonFactory) {
+		JFinalJsonKit.toJsonFactory = toJsonFactory;
+	}
 }
 }