C#Json.NET渲染将枚举标记为字符串数组 [英] C# Json.NET Render Flags Enum as String Array
本文介绍了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屋!
查看全文