【问题标题】:Selecting a NamingStrategy when using a JsonConverter on a class property在类属性上使用 JsonConverter 时选择 NamingStrategy
【发布时间】:2019-02-01 17:51:04
【问题描述】:

我有一个 c# 类,我正在尝试使用 Newtonsoft.Json 正确序列化它。该属性是一个枚举类型,我希望将该值序列化为“枚举名称的小写版本”。有一个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"

有什么想法吗?谢谢。

【问题讨论】:

    标签: c# json.net jsonconverter


    【解决方案1】:

    好的,这似乎可行:

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

    由于NamingStrategyStringEnumConverter 的属性,它使用converterParameters 参数应用。这得到了我想要的输出。我认为这方面的一个例子在 Newtonsoft 文档中会很有用。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        这适用于我在 .Net Core web api 中的单个位置启用骆驼套管:

        [JsonConverter(typeof(StringEnumConverter), true)]
        

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

        StringEnumConverter(bool camelCaseText)
        

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

        【讨论】:

        猜你喜欢
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        相关资源
        最近更新 更多