C# Json.NET Render Flags Enum as String Array C# Json.NET Render Flags Enum as String Array json json

C# Json.NET Render Flags Enum as String Array


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;    }}

Now decorate your enum like this:

[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"]}


Decorate your enum

[Flags][JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]public enum F{    Val1 = 1,    Val2 = 2,    Val4 = 4,    Val8 = 8}

Output:

{"Flags":"Val1, Val4"}

I realise the JSON is not an array as in your question, wasn't sure if this was required since this is also valid JSON.


I used @DavidG's answer above, but needed an implementation for ReadJson. Here's what I put together:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){    int outVal = 0;    if (reader.TokenType == JsonToken.StartArray)    {        reader.Read();        while (reader.TokenType != JsonToken.EndArray)        {            outVal += (int)Enum.Parse(objectType, reader.Value.ToString());            reader.Read();        }    }    return outVal;}