Newtonsoft自定义日期转换器传字符串数组报无匹配构造函数错误
问题原因
Newtonsoft.Json 在通过[JsonConverter]特性实例化自定义转换器时,构造函数匹配逻辑不识别C#的params参数语法糖:
你在特性上传入了2个独立的字符串参数"dd/MM/yyyy"、"dd/MM/yy",框架会按传入参数的个数、类型逐位匹配构造函数签名,尝试查找拥有两个string类型参数的构造函数。但你的转换器仅定义了一个接收string[]类型参数的构造函数,框架不会自动将多个独立传入的字符串打包为数组传入,因此抛出找不到匹配参数化构造函数的异常。
修正方案
修改自定义转换器的构造函数,适配框架的构造函数匹配逻辑即可,推荐使用兼容任意数量日期格式的通用写法:
public class MultiFormatDateConverter : JsonConverter { public override bool CanWrite => true; private readonly string[] _formats; public override bool CanConvert(Type objectType) { // 可按需保留对DateTime?可空类型的支持 return objectType == typeof(DateTime) || objectType == typeof(DateTime?); } // 替换原有的params string[]构造函数 public MultiFormatDateConverter(params object[] formats) { _formats = formats.Cast<string>().ToArray(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 补全你的解析逻辑即可,示例参考: if (reader.TokenType == JsonToken.Null) return objectType == typeof(DateTime?) ? null : default(DateTime); var dateString = reader.Value?.ToString(); if (DateTime.TryParseExact(dateString, _formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parseResult)) return parseResult; throw new JsonSerializationException($"日期字符串「{dateString}」不符合配置的任何有效格式"); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 补全你的序列化逻辑即可,示例参考: if (value == null) writer.WriteNull(); else writer.WriteValue(((DateTime)value).ToString(_formats[0])); } }
修改完成后,实体类上的[JsonConverter]特性标注不需要做任何调整,即可正常实例化转换器完成日期解析。
如果你的业务场景只需要支持固定数量的日期格式,也可以通过添加对应参数个数的构造函数重载解决(比如支持2个格式就加MultiFormatDateConverter(string format1, string format2)的重载),但灵活性低于上述通用写法。
内容的提问来源于stack exchange,提问作者swapnil jajoo
相关产品推荐
相关产品推荐

