C#Json.NET渲染将枚举标记为字符串数组 [英] C# Json.NET Render Flags Enum as String Array

查看:153
本文介绍了C#Json.NET渲染将枚举标记为字符串数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在.NET应用程序中,我有一组值存储为[Flags] enum.我想将这些序列化为json,但我不想让结果为整数,而是想为有效的标志获取一个字符串数组.

In a .NET Application, I have a set of values that are stored as a [Flags] enum. I want to serialize these to json, but instead of having the result be an integer, I'd like to get an array of string for the flags that are active.

如果我有以下代码

[Flags]
public enum F
{
    Val1 = 1,
    Val2 = 2,
    Val4 = 4,
    Val8 = 8

}

public class C
{        
    public F Flags { get; set; }
}

string Serialize() {
    return JsonConvert.SerializeObject(new C { Flags = F.Val1 | F.Val4 });
}

我希望Serialize()方法返回:

"{ Flags: [ "Val1", "Val4" ] }"

代替:

"{ Flags: 5 }"

推荐答案

您必须实现自己的转换器.这是一个示例(一种特别肮脏又笨拙的方式,但它是一个很好的演示):

You have to implement your own converter. Here's an example (a particularly dirty and hacky way of doing it, but it serves as a good demo):

public class FlagConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader,  Type objectType, Object existingValue, JsonSerializer serializer)
    {
        //If you need to deserialize, fill in the code here
        return null;
    }

    public override void WriteJson(JsonWriter writer, Object value, JsonSerializer serializer)
    {
        var flags = value.ToString()
            .Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries)
            .Select(f => $"\"{f}\"");

        writer.WriteRawValue($"[{string.Join(", ", flags)}]");
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}

现在像这样装饰枚举:

[Flags]
[JsonConverter(typeof(FlagConverter))]
public enum F
{
    Val1 = 1,
    Val2 = 2,
    Val4 = 4,
    Val8 = 8
}

您的示例序列化代码现在将输出以下内容:

And your example serialisation code will now output this:

{"Flags":["Val1", "Val4"]}

这篇关于C#Json.NET渲染将枚举标记为字符串数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆