C# Newtonsoft.Json反序列化多构造函数类找不到构造函数问题问询
问题原因
- Newtonsoft.Json 反序列化时默认优先使用无参构造函数实例化对象,你当前的
License类只定义了两个带参构造函数,未提供无参构造函数 - 现有两个带参构造函数的参数名称、类型和JSON返回字段无法完全匹配:
- 错误响应的错误数据字段名为
data,但你给错误数据属性标记的JsonProperty为error_data,第二个构造函数的参数名也为error_data,和JSON实际字段不匹配 - 反序列化时JSON无法明确匹配到两个带参构造函数中的任意一个,因此抛出找不到构造函数的错误
- 错误响应的错误数据字段名为
解决方案
方案一:极简修复(推荐)
仅需两步就可以兼容现有业务逻辑:
- 给
License类添加无参构造函数
public License() { // 空实现即可,Newtonsoft.Json会自动通过属性上的JsonProperty标记完成赋值 }
- 调整
data字段属性定义,兼容两种场景的返回值
// 删除原有的Success_Data和Error_Data两个属性,合并为一个通用data属性 [JsonProperty("data")] public object Data { get; set; }
后续使用时自行判断场景做类型转换即可:
License license = JsonConvert.DeserializeObject<License>(json_str); if (license.Success == true) { Success_Data successData = license.Data as Success_Data; // 处理成功业务逻辑 } else if (!string.IsNullOrEmpty(license.Code)) { Error_Data errorData = license.Data as Error_Data; // 处理错误业务逻辑 }
方案二:自定义JsonConverter(无需修改原有License类结构)
如果你不想调整原有类的属性和构造函数定义,可以自定义JSON转换器直接匹配两种响应场景:
public class LicenseJsonConverter : JsonConverter<License> { public override License ReadJson(JsonReader reader, Type objectType, License existingValue, bool hasExistingValue, JsonSerializer serializer) { JObject jObj = JObject.Load(reader); // 判断为成功响应 if (jObj.ContainsKey("success")) { return new License( jObj["success"].Value<bool>(), jObj["data"].ToObject<Success_Data>(serializer) ); } // 判断为错误响应 return new License( jObj["code"].Value<string>(), jObj["message"].Value<string>(), jObj["data"].ToObject<Error_Data>(serializer) ); } public override void WriteJson(JsonWriter writer, License value, JsonSerializer serializer) { throw new NotImplementedException(); } }
反序列化时指定转换器即可:
License license = JsonConvert.DeserializeObject<License>(json_str, new LicenseJsonConverter());
内容的提问来源于stack exchange,提问作者paralax
相关产品推荐
相关产品推荐

