diff --git a/ReZero/SuperAPI/MethodGeneratorAPI/MethodGeneratorAPI.cs b/ReZero/SuperAPI/MethodGeneratorAPI/MethodGeneratorAPI.cs index 59bae80..8c010d1 100644 --- a/ReZero/SuperAPI/MethodGeneratorAPI/MethodGeneratorAPI.cs +++ b/ReZero/SuperAPI/MethodGeneratorAPI/MethodGeneratorAPI.cs @@ -65,6 +65,24 @@ namespace ReZero.SuperAPI // 先检查method的参数类型 var methodParams = methodInfo.GetParameters(); + // 使用新的参数绑定方式:直接根据方法参数类型进行JSON绑定 + if (!string.IsNullOrEmpty(dataModel.RawJsonData)) + { + try + { + bool bindingSuccess = DirectJsonParameterBinding(dataModel, methodInfo, parameters); + if (bindingSuccess) + { + return parameters; + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"直接绑定失败: {ex.Message},回退到原有绑定方式"); + } + } + + // 如果直接绑定失败,回退到现有逻辑 // 先尝试判断是否是JToken/JObject参数 if (methodParams.Length == 1 && (typeof(Newtonsoft.Json.Linq.JToken).IsAssignableFrom(methodParams[0].ParameterType))) @@ -275,24 +293,8 @@ namespace ReZero.SuperAPI try { - // 检查原始JSON是否需要转义处理 - if (rawJson.Contains("\\\"")) - { - rawJson = rawJson.Replace("\\\"", "\""); - } - // 解析JSON - JObject jsonObj = null; - try - { - jsonObj = JObject.Parse(rawJson); - System.Diagnostics.Debug.WriteLine($"成功解析JSON对象,属性数量: {jsonObj.Properties().Count()}"); - } - catch - { - System.Diagnostics.Debug.WriteLine("JSON解析失败,尝试使用JsonConvert"); - throw; - } + JObject jsonObj = JObject.Parse(rawJson); // 获取方法参数信息 var methodParams = methodInfo.GetParameters(); @@ -305,6 +307,35 @@ namespace ReZero.SuperAPI System.Diagnostics.Debug.WriteLine($"参数名: {paramName}, 类型: {paramType.Name}"); + // 特殊处理:如果参数类型为JObject或JToken,直接使用整个JSON对象 + if (typeof(JToken).IsAssignableFrom(paramType)) + { + System.Diagnostics.Debug.WriteLine($"检测到JToken类型参数,直接使用整个JSON对象"); + if (paramType == typeof(JObject)) + { + parameters[0] = jsonObj; + System.Diagnostics.Debug.WriteLine("成功绑定JObject参数"); + } + else if (paramType == typeof(JToken)) + { + parameters[0] = (JToken)jsonObj; + System.Diagnostics.Debug.WriteLine("成功绑定JToken参数"); + } + else if (paramType == typeof(JArray)) + { + try + { + parameters[0] = JArray.Parse(rawJson); + System.Diagnostics.Debug.WriteLine("成功绑定JArray参数"); + } + catch + { + System.Diagnostics.Debug.WriteLine("JSON不是有效的数组格式,无法绑定JArray参数"); + } + } + return; // 处理完成,直接返回 + } + // 检查JSON中是否存在与参数同名的属性 if (jsonObj.ContainsKey(paramName)) { @@ -315,13 +346,32 @@ namespace ReZero.SuperAPI // 转换为参数类型 try { + // 特殊处理List类型参数 if (propValue.Type == JTokenType.Array && - (paramType.IsGenericType && - paramType.GetGenericTypeDefinition() == typeof(List<>))) + paramType.IsGenericType && + paramType.GetGenericTypeDefinition() == typeof(List<>)) { - // 处理数组到List的转换 + // 获取List的泛型参数类型 + Type itemType = paramType.GetGenericArguments()[0]; + System.Diagnostics.Debug.WriteLine($"处理List<{itemType.Name}>类型参数"); + + // 获取JSON数组字符串 string arrayJson = propValue.ToString(); - parameters[0] = JsonConvert.DeserializeObject(arrayJson, paramType); + + // 使用指定的设置反序列化 + var settings = new JsonSerializerSettings + { + TypeNameHandling = TypeNameHandling.Auto + }; + parameters[0] = JsonConvert.DeserializeObject(arrayJson, paramType, settings); + + // 如果反序列化结果为null,则创建空列表 + if (parameters[0] == null) + { + var listType = typeof(List<>).MakeGenericType(itemType); + parameters[0] = Activator.CreateInstance(listType); + } + System.Diagnostics.Debug.WriteLine($"成功将数组属性 {paramName} 转换为List类型"); } else @@ -360,29 +410,7 @@ namespace ReZero.SuperAPI catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"JSON反序列化失败: {ex.Message}"); - - // 如果反序列化失败,尝试JToken特殊处理 - if (typeof(JToken).IsAssignableFrom(paramType)) - { - if (paramType == typeof(JObject)) - { - parameters[0] = jsonObj; - System.Diagnostics.Debug.WriteLine("直接使用解析后的JObject"); - } - else if (paramType == typeof(JToken)) - { - parameters[0] = jsonObj; - System.Diagnostics.Debug.WriteLine("将JObject转换为JToken"); - } - else - { - System.Diagnostics.Debug.WriteLine($"无法处理的JToken子类型: {paramType.Name}"); - } - } - else - { - System.Diagnostics.Debug.WriteLine($"无法将JSON转换为类型 {paramType.Name}"); - } + System.Diagnostics.Debug.WriteLine($"无法将JSON转换为类型 {paramType.Name}"); } } } @@ -421,8 +449,40 @@ namespace ReZero.SuperAPI // 回退到原始方法 try { - var type = methodInfo.GetParameters().First().ParameterType; - parameters[0] = JsonConvert.DeserializeObject(rawJson, type); + var paramInfo = methodInfo.GetParameters().First(); + var paramType = paramInfo.ParameterType; + + // 对于JObject/JToken类型,尝试直接解析 + if (typeof(JToken).IsAssignableFrom(paramType)) + { + try + { + if (paramType == typeof(JObject)) + { + parameters[0] = JObject.Parse(rawJson); + System.Diagnostics.Debug.WriteLine("回退处理:成功解析为JObject"); + } + else if (paramType == typeof(JToken)) + { + parameters[0] = JToken.Parse(rawJson); + System.Diagnostics.Debug.WriteLine("回退处理:成功解析为JToken"); + } + else if (paramType == typeof(JArray)) + { + parameters[0] = JArray.Parse(rawJson); + System.Diagnostics.Debug.WriteLine("回退处理:成功解析为JArray"); + } + } + catch (Exception jEx) + { + System.Diagnostics.Debug.WriteLine($"回退处理JToken解析失败: {jEx.Message}"); + } + } + else + { + parameters[0] = JsonConvert.DeserializeObject(rawJson, paramType); + System.Diagnostics.Debug.WriteLine("回退处理:使用JsonConvert反序列化"); + } } catch (Exception fallbackEx) { @@ -710,5 +770,211 @@ namespace ReZero.SuperAPI else return Newtonsoft.Json.Linq.JValue.CreateNull(); } + + // 直接根据方法参数信息进行JSON绑定 + private bool DirectJsonParameterBinding(DataModel dataModel, MethodInfo methodInfo, object[] parameters) + { + var rawJson = dataModel.RawJsonData; + if (string.IsNullOrEmpty(rawJson)) + { + return false; + } + + System.Diagnostics.Debug.WriteLine($"直接根据方法参数进行JSON绑定,JSON: {rawJson}"); + + try + { + // 解析JSON + JObject jsonObj = JObject.Parse(rawJson); + var methodParams = methodInfo.GetParameters(); + + // 检查参数数量 + if (methodParams.Length == 0) + { + return false; // 没有参数需要绑定 + } + + // 单参数情况优先处理 + if (methodParams.Length == 1) + { + var paramInfo = methodParams[0]; + var paramName = paramInfo.Name; + var paramType = paramInfo.ParameterType; + + System.Diagnostics.Debug.WriteLine($"单参数处理: 名称={paramName}, 类型={paramType.FullName}"); + + // 处理JToken及其子类型 + if (typeof(Newtonsoft.Json.Linq.JToken).IsAssignableFrom(paramType)) + { + parameters[0] = paramType == typeof(Newtonsoft.Json.Linq.JObject) + ? jsonObj + : (paramType == typeof(Newtonsoft.Json.Linq.JArray) + ? JArray.Parse(rawJson) + : JToken.Parse(rawJson)); + return true; + } + + // 检查是否有与参数同名的属性 + if (jsonObj.ContainsKey(paramName)) + { + JToken propValue = jsonObj[paramName]; + + // 特殊处理泛型List + if (propValue.Type == JTokenType.Array && + paramType.IsGenericType && + paramType.GetGenericTypeDefinition() == typeof(List<>)) + { + Type itemType = paramType.GetGenericArguments()[0]; + System.Diagnostics.Debug.WriteLine($"泛型List处理: 项类型={itemType.FullName}"); + + try + { + // 使用TypeNameHandling.All可以帮助处理多态类型 + var serializerSettings = new JsonSerializerSettings + { + TypeNameHandling = TypeNameHandling.Auto, + NullValueHandling = NullValueHandling.Ignore + }; + + string arrayJson = propValue.ToString(); + var listObj = JsonConvert.DeserializeObject(arrayJson, paramType, serializerSettings); + + // 如果反序列化结果为null,尝试手动创建列表 + if (listObj == null) + { + var listType = typeof(List<>).MakeGenericType(itemType); + var list = Activator.CreateInstance(listType); + + // 手动将每个JSON项转换为目标类型 + JArray jArray = JArray.Parse(arrayJson); + var addMethod = listType.GetMethod("Add"); + + foreach (var item in jArray) + { + try + { + var objItem = item.ToObject(itemType, JsonSerializer.Create(serializerSettings)); + addMethod.Invoke(list, new[] { objItem }); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"列表项转换失败: {ex.Message}"); + } + } + + listObj = list; + } + + parameters[0] = listObj; + System.Diagnostics.Debug.WriteLine($"成功绑定List参数: 元素数量={(listObj as System.Collections.IList)?.Count ?? 0}"); + return true; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"List绑定异常: {ex.Message}"); + + // 出错时创建空列表而不是返回null + var listType = typeof(List<>).MakeGenericType(itemType); + parameters[0] = Activator.CreateInstance(listType); + return true; + } + } + else + { + // 常规类型转换 + try + { + parameters[0] = propValue.ToObject(paramType); + return true; + } + catch + { + // 转换失败,继续使用回退处理 + } + } + } + else + { + // 尝试将整个JSON对象反序列化为参数类型 + try + { + parameters[0] = JsonConvert.DeserializeObject(rawJson, paramType); + if (parameters[0] != null) + { + return true; + } + } + catch + { + // 转换失败,继续使用回退处理 + } + } + } + else + { + // 多参数处理 + bool anyParamBound = false; + + for (int i = 0; i < methodParams.Length; i++) + { + var paramInfo = methodParams[i]; + var paramName = paramInfo.Name; + var paramType = paramInfo.ParameterType; + + if (jsonObj.ContainsKey(paramName)) + { + try + { + JToken propValue = jsonObj[paramName]; + + // 特殊处理泛型List + if (propValue.Type == JTokenType.Array && + paramType.IsGenericType && + paramType.GetGenericTypeDefinition() == typeof(List<>)) + { + Type itemType = paramType.GetGenericArguments()[0]; + + var serializerSettings = new JsonSerializerSettings + { + TypeNameHandling = TypeNameHandling.Auto, + NullValueHandling = NullValueHandling.Ignore + }; + + string arrayJson = propValue.ToString(); + var listObj = JsonConvert.DeserializeObject(arrayJson, paramType, serializerSettings); + + if (listObj == null) + { + var listType = typeof(List<>).MakeGenericType(itemType); + listObj = Activator.CreateInstance(listType); + } + + parameters[i] = listObj; + } + else + { + parameters[i] = propValue.ToObject(paramType); + } + + anyParamBound = true; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"多参数绑定失败: {paramName}, {ex.Message}"); + } + } + } + + return anyParamBound; + } + + return false; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"直接绑定总异常: {ex.Message}"); + return false; + } + } } }