用一种方法重写JsonConvertor默认设置的最佳方法是什么

时间:2018-06-28 15:01:38

标签: c# .net json.net

比方说,我有一项服务,在该服务中,我遵循了JsonSerializerSettings的默认设置。

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver(),
                Formatting = Formatting.None,
                Converters = new List<JsonConverter> { new Newtonsoft.Json.Converters.StringEnumConverter()},
                DateParseHandling = DateParseHandling.DateTimeOffset
            };

对于调用外部dll的方法调用之一,必须更改DateParseHandling的此值。即使该方法本身返回了模型,由于某种原因,它还是采用了我们服务的本地默认设置。

在调试时,我们发现该方法需要进行以下设置,

DateParseHandling = DateParseHandling.DateTime

因此,我们唯一可以使它起作用或丑陋的方法就是将DefaultSettings重置为

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            DateParseHandling = DateParseHandling.DateTime
        };

但是,此代码将覆盖当前的默认设置,我们不希望这样做。另外,如果我们有JsonString,我们可以这样使用,

JsonConvert.DeserializeObject<Twin>(jsontext, new JsonSerializerSettings { DateParseHandling = DateParseHandling.DateTime});

目前无法选择。

其他详细信息

外部方法使用转换器:TwinJsonConvertor(Link to Git

任何想法,最好的方法是仅覆盖一个呼叫的默认设置。

1 个答案:

答案 0 :(得分:1)

如果您在并发方面没有问题,则可以执行以下操作:

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;
}

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