如何将属性传递给JsonConverterAttribute中的StringEnumConverter

Bri*_*ian 7 c# json.net

我正在尝试使用Newtonsoft的JsonConvert将对象列表序列化为JSON.我的Marker类包含一个枚举,我正在尝试将它序列化为一个camelCase字符串.基于其他Stackoverflow问题,我正在尝试使用StringEnumConverter:

public enum MarkerType
{
    None = 0,
    Bookmark = 1,
    Highlight = 2
}

public class Marker
{
    [JsonConverter(typeof(StringEnumConverter)]
    public MarkerType MarkerType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这部分有效,但是当我调用时,我的MarkerType字符串是PascalCase:

var json = JsonConvert.SerializeObject(markers, Formatting.None);
Run Code Online (Sandbox Code Playgroud)

结果:

{
    ...,
    "MarkerType":"Bookmark"
}
Run Code Online (Sandbox Code Playgroud)

我真正想要的是:

{
    ...,
    "MarkerType":"bookmark"
}
Run Code Online (Sandbox Code Playgroud)

StringEnumConverter文档提到一个CamelCaseText属性,但我不知道如何使用的传递JsonConverterAttribute.以下代码失败:

[JsonConverter(typeof(StringEnumConverter), new object[] { "camelCaseText" }]
Run Code Online (Sandbox Code Playgroud)

如何指定CamelCaseText为属性StringEnumConverterJsonConverterAttribute

Bri*_*ian 15

JsonConverterAttribute有两个构造函数,其中一个构造函数采用参数列表(Object[]).这将映射到该类型的构造函数.

由于StringEnumConverter的一个构造函数接受一个布尔值Object[],你只需要在属性行中传递它:

[JsonConverter(typeof(StringEnumConverter), typeof(CamelCaseNamingStrategy))]
public MarkerType MarkerType { get; set; }
Run Code Online (Sandbox Code Playgroud)

请注意,这仅限于构造函数; 有没有办法来设置Object[]Object[]使用的Object[]语法,因为唯一的非默认的构造函数只需要一个参数Object[].