You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:12:17