C# 在一个方法中重写JsonConvertor默认设置的最佳方法是什么

C# 在一个方法中重写JsonConvertor默认设置的最佳方法是什么,c#,.net,json.net,C#,.net,Json.net,假设我有一个服务,其中有以下JsonSerializerSettings的默认设置 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Formatting = Formatting.None,

假设我有一个服务,其中有以下JsonSerializerSettings的默认设置

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver(),
                Formatting = Formatting.None,
                Converters = new List<JsonConverter> { new Newtonsoft.Json.Converters.StringEnumConverter()},
                DateParseHandling = DateParseHandling.DateTimeOffset
            };
所以我们唯一能让它工作的或者是一个丑陋的黑客就是把默认设置重置为

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            DateParseHandling = DateParseHandling.DateTime
        };
但是,此代码将覆盖当前的默认设置,我们不希望这样做。如果我们有JsonString我们也可以这样使用

JsonConvert.DeserializeObject<Twin>(jsontext, new JsonSerializerSettings { DateParseHandling = DateParseHandling.DateTime});
JsonConvert.DeserializeObject(jsontext,新的JsonSerializerSettings{DateParseHandling=DateParseHandling.DateTime});
目前这不是一个选择

其他详细信息

外部方法使用一个转换器:TwinJsonConvertor()


您知道哪种方法是覆盖一次调用的默认设置的最佳方法吗。

如果您在并发性方面没有问题,您可以执行类似的操作:

public static boolean ativateSpecialDateSerialization = false;

JsonConvert.DefaultSettings = () =>
{
    var settings = new JsonSerializerSettings();

    if (ativateSpecialDateSerialization)
    {
        // Special date parsing settings
        settings.DateParseHandling = DateParseHandling.DateTime     
    }
    else
    {
        // Default settings
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver(),
        settings.Formatting = Formatting.None,
        settings.Converters = new List<JsonConverter> { new Newtonsoft.Json.Converters.StringEnumConverter()},
        settings.DateParseHandling = DateParseHandling.DateTimeOffset
    }

    return settings;
};


try
{
    ativateSpecialDateSerialization = true;

    // Call to your extrernal method
}
finally
{
    ativateSpecialDateSerialization = false;
}
public static boolean ativateSpecialDateSerialization=false;
JsonConvert.DefaultSettings=()=>
{
var settings=new JsonSerializerSettings();
if(ativateSpecialDateSerialization)
{
//特殊日期解析设置
settings.DateParseHandling=DateParseHandling.DateTime
}
其他的
{
//默认设置
settings.ContractResolver=新的CamelCasePropertyNamesContractResolver(),
settings.Formatting=格式化.None,
settings.Converters=新列表{new Newtonsoft.Json.Converters.StringEnumConverter()},
settings.DateParseHandling=DateParseHandling.DateTimeOffset
}
返回设置;
};
尝试
{
ativateSpecialDateSerialization=true;
//调用外部方法
}
最后
{
ativateSpecialDateSerialization=false;
}

您还可以通过保留
JsonSerializerSettings
对象来改进代码。

不过,我们在并发性方面确实存在一些问题。但是谢谢你的解决方案
public static boolean ativateSpecialDateSerialization = false;

JsonConvert.DefaultSettings = () =>
{
    var settings = new JsonSerializerSettings();

    if (ativateSpecialDateSerialization)
    {
        // Special date parsing settings
        settings.DateParseHandling = DateParseHandling.DateTime     
    }
    else
    {
        // Default settings
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver(),
        settings.Formatting = Formatting.None,
        settings.Converters = new List<JsonConverter> { new Newtonsoft.Json.Converters.StringEnumConverter()},
        settings.DateParseHandling = DateParseHandling.DateTimeOffset
    }

    return settings;
};


try
{
    ativateSpecialDateSerialization = true;

    // Call to your extrernal method
}
finally
{
    ativateSpecialDateSerialization = false;
}