使用StringEnumConverter将枚举值序列化为驼峰式字符串。

11

我正在尝试使用Newtonsoft的JsonConvert将对象列表序列化为JSON。我的Marker类包括一个枚举,我正在尝试将其序列化为驼峰式字符串。基于其他Stackoverflow问题,我正在尝试使用StringEnumConverter

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

public class Marker
{
    [JsonConverter(typeof(StringEnumConverter)]
    public MarkerType MarkerType { get; set; }
}

这个部分代码可以工作,但是当我调用时,我的 MarkerType 字符串是 PascalCase:

var json = JsonConvert.SerializeObject(markers, Formatting.None);

结果:

{
    ...,
    "MarkerType":"Bookmark"
}

我真正需要的是:

{
    ...,
    "MarkerType":"bookmark"
}

StringEnumConverter文档中提到了CamelCaseText属性,但我不确定如何使用JsonConverterAttribute传递它。 下面的代码会失败:

[JsonConverter(typeof(StringEnumConverter), new object[] { "camelCaseText" }]

JsonConverterAttribute中如何指定StringEnumConverterCamelCaseText属性?

1个回答

25

JsonConverterAttribute有两个构造函数,其中一个带有参数列表(Object[])。这映射到第一个参数的类型的constructor

StringEnumConverter可以使用其大多数非默认构造函数来处理此问题。

第一个在JSON.net 12+中已过时。

第二个允许您指定NamingStrategy类型;CamelCaseNamingStrategy很方便。 实际上,对于提供的六个构造函数中的三个,情况都是如此。

注意:另一个构造函数打破了规则,需要一个NamingStrategy实例而不是一个类型。

它会长这样:

[JsonConverter(typeof(StringEnumConverter), typeof(CamelCaseNamingStrategy))]
public MarkerType MarkerType { get; set; }

从Newtonsoft.Json v 12开始,有_5_个非默认构造函数,其中包括两个具有allowIntegerValues选项的构造函数。 - user3896255
1
@WebHead 感谢您的留言!我已经更新了答案,考虑到了新的构造函数。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接