C# Json.NET Render Flags Enum como matriz de cadenas

C# Json.NET Render Flags Enum como matriz de cadenas

Tienes que implementar tu propio convertidor. Aquí hay un ejemplo (una forma particularmente sucia y complicada de hacerlo, pero sirve como una buena demostración):

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

Ahora decora tu enumeración así:

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

Y su código de serialización de ejemplo ahora generará esto:

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

Decora tu enum

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

Salida:

Me doy cuenta de que JSON no es una matriz como en su pregunta, no estaba seguro de si esto era necesario ya que también es JSON válido.


Usé la respuesta anterior de @DavidG, pero necesitaba una implementación para ReadJson. Esto es lo que reuní:

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