在 class 属性 上使用 JsonConverter 时选择 NamingStrategy

Selecting a NamingStrategy when using a JsonConverter on a class property

我有一个 c# class,我正在尝试使用 Newtonsoft.Json 正确序列化。 属性 是枚举类型,我希望将值序列化为 "lowercase version of the enumeration name"。有一个 JsonConverterAttribute 可用于在 属性 上指定它,还有一个预写的 StringEnumConverter 但我需要在该转换器上指定 CamelCaseNamingStrategy 但我无法计算出语法。

我试图在 属性 本身上分配它:

public class C
{
    [JsonConverter(typeof(StringEnumConverter),NamingStrategy=typeof(CamelCaseNamingStrategy))]
    public ChartType ChartType { get; set; }
}

我也试过将它类似地添加到枚举类型本身:

[JsonConverter(typeof(StringEnumConverter),NamingStrategy=typeof(CamelCaseNamingStrategy))]
public enum ChartType { Pie, Bar }

但是语法错误。我在 Newtonsoft documentation 中找不到这方面的任何示例。

所需的序列化为:"ChartType":"pie""ChartType":"bar"

有什么想法吗?谢谢。

好的,这似乎有效:

[JsonProperty("type")] 
[JsonConverter(typeof(StringEnumConverter), 
     converterParameters:typeof(CamelCaseNamingStrategy))]
public ChartType ChartType { get; }  

作为NamingStrategy is a property of the StringEnumConverter it's applied using the converterParameters参数。这得到了我想要的输出。我认为这方面的示例在 Newtonsoft 文档中很有用。

另一种可能的解决方案是使用 JsonSerializerSettings

var settings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> {
        new StringEnumConverter(new CamelCaseNamingStrategy())
    }
};
var result = JsonConvert.SerializeObject(obj, settings);

这对我有用,可以在 .Net Core web 的一个地方启用驼峰式外壳 api:

[JsonConverter(typeof(StringEnumConverter), true)]

请注意,您可以将构造函数参数附加到第一个参数给定的类型,StringEnumConverter 具有以下重载构造函数:

StringEnumConverter(bool camelCaseText)

当然,通常首选全局启用此功能,例如 here 所讨论的。