C# 如何使用枚举的字符串值序列化枚举列表

C# 如何使用枚举的字符串值序列化枚举列表,c#,serialization,json.net,C#,Serialization,Json.net,这是我的枚举类型: 我想使用字符串值序列化此枚举。。。当我尝试以下代码时,数值用于序列化: [TestMethod] public void Serialize_access_scopes() { var requiredPermissions = new List<AccessScope>() { AccessScope.ReadContent, AccessScope.WriteContent, }; var co

这是我的枚举类型:

我想使用字符串值序列化此枚举。。。当我尝试以下代码时,数值用于序列化:

[TestMethod]
public void Serialize_access_scopes()
{
    var requiredPermissions = new List<AccessScope>()
    {
        AccessScope.ReadContent,
        AccessScope.WriteContent,
    };

    var commaSeparatedPermissions = JsonConvert.SerializeObject(requiredPermissions);  

    commaSeparatedPermissions.Should().Be("read_content, write_content");
}

你需要一个自定义转换器;也许:

使用Newtonsoft.Json; 使用Newtonsoft.Json.Converters; 使用制度; 使用System.Collections.Concurrent; 使用System.Collections.Generic; 运用系统反思; 静态P类 { 类ByNameString GenumConverter:StringEnumConverter { 静态ConcurrentDictionary s_byTypeCache=新ConcurrentDictionary; 静态字符串名称,对象值[]GetMapType type=>s_byTypeCache.TryGetValuetype,输出变量结果?结果:AddForTypetype; 静态字符串名称,对象值[]AddForTypeType类型 { var fields=type.GetFieldsBindingFlags.Static | BindingFlags.Public; var map=Array.ConvertAllfields,field=> { 字符串名称=field.name; 如果Attribute.GetCustomAttributefield,则JsonPropertyAttribute的类型为JsonPropertyAttribute jprop &&!string.IsNullOrWhiteSpacejprop.PropertyName { name=jprop.PropertyName; } 返回名称,field.GetValuenull; }; s_byTypeCache.TryAddtype,映射; 返回图; } 公共重写对象ReadJsonJsonReader、类型objectType、对象existingValue、JsonSerializer序列化程序 { 如果reader.TokenType==JsonToken.String&&reader.Value是String s&&objectType.IsEnum { var-map=GetMapobjectType; 对于int i=0;i你需要一个自定义转换器;也许:

使用Newtonsoft.Json; 使用Newtonsoft.Json.Converters; 使用制度; 使用System.Collections.Concurrent; 使用System.Collections.Generic; 运用系统反思; 静态P类 { 类ByNameString GenumConverter:StringEnumConverter { 静态ConcurrentDictionary s_byTypeCache=新ConcurrentDictionary; 静态字符串名称,对象值[]GetMapType type=>s_byTypeCache.TryGetValuetype,输出变量结果?结果:AddForTypetype; 静态字符串名称,对象值[]AddForTypeType类型 { var fields=type.GetFieldsBindingFlags.Static | BindingFlags.Public; var map=Array.ConvertAllfields,field=> { 字符串名称=field.name; 如果Attribute.GetCustomAttributefield,则JsonPropertyAttribute的类型为JsonPropertyAttribute jprop &&!string.IsNullOrWhiteSpacejprop.PropertyName { name=jprop.PropertyName; } 返回名称,field.GetValuenull; }; s_byTypeCache.TryAddtype,映射; 返回图; } 公共重写对象ReadJsonJsonReader、类型objectType、对象existingValue、JsonSerializer序列化程序 { 如果reader.TokenType==JsonToken.String&&reader.Value是String s&&objectType.IsEnum { var-map=GetMapobjectType; 对于int i=0;i 比如说,

[JsonConverter(typeof(StringEnumConverter))]
public enum AccessScope
{
    [EnumMember(Value="read_content")]
    ReadContent,

    [EnumMember(Value="write_content")]
    WriteContent,

    [EnumMember(Value="read_themes")]
    ReadThemes,

    [EnumMember(Value="write_themes")]
    WriteThemes
} 
现在可以反序列化为

var requiredPermissions = new List<AccessScope>()
{
    AccessScope.ReadContent,
    AccessScope.WriteContent,
};

var result = JsonConvert.SerializeObject(requiredPermissions);
您可以使用Json.Net提供的而不是定义自定义转换器,还可以使用而不是JsonPropertyAttribute

比如说,

[JsonConverter(typeof(StringEnumConverter))]
public enum AccessScope
{
    [EnumMember(Value="read_content")]
    ReadContent,

    [EnumMember(Value="write_content")]
    WriteContent,

    [EnumMember(Value="read_themes")]
    ReadThemes,

    [EnumMember(Value="write_themes")]
    WriteThemes
} 
现在可以反序列化为

var requiredPermissions = new List<AccessScope>()
{
    AccessScope.ReadContent,
    AccessScope.WriteContent,
};

var result = JsonConvert.SerializeObject(requiredPermissions);

[JsonConvertertypeofStringEnumConverter]有点接近,但在这种情况下,您可能需要编写一个自定义转换器;此外,预期的输出肯定是[\read\u content\,\write\u content\]?@marcgravel:谢谢您的帮助。。。不确定我是否正确理解了你的评论。。。我尝试将JsonConverter添加到枚举中,但仍然得到相同的数值结果,更新了我在类型上所指的问题,但是:JsonConverter在这里做得不够;我添加了一个自定义序列化程序示例[JsonConvertertypeofStringEnumConverter]有点接近,但在这种情况下,您可能需要编写一个自定义转换器;此外,预期的输出肯定是[\read\u content\,\write\u content\]?@marcgravel:谢谢您的帮助。。。不确定我是否正确理解了你的评论。。。我尝试将JsonConverter添加到枚举中,但仍然得到相同的数值结果,更新了我在类型上所指的问题,但是:JsonConverter在这里做得不够;我添加了一个自定义序列化程序示例。这个答案要简单得多,谢谢。我能用这个方法进行反向反序列化吗?i、 e.如果字符串是逗号分隔的,则传递一个列表并构建一个枚举列表?@HoomanBahreini是的,您可以执行JsonConvert.DeserializeObject['read_content','write_content']这个答案简单得多,谢谢。我能用这个方法进行反向反序列化吗?i、 e.如果字符串是逗号分隔的,则传递列表并生成枚举列表?@HoomanBahreini是的,您可以执行JsonConvert.DeserializeObject['read_content','write_content']