C# Json.NET Render Flags Enum als String-Array

C# Json.NET Render Flags Enum als String-Array

Sie müssen Ihren eigenen Konverter implementieren. Hier ist ein Beispiel (eine besonders schmutzige und abgehackte Art, es zu tun, aber es dient als gute 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;
    }
}

Dekorieren Sie nun Ihre Aufzählung wie folgt:

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

Und Ihr Beispielserialisierungscode gibt jetzt Folgendes aus:

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

Schmücken Sie Ihren enum

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

Ausgabe:

Mir ist klar, dass JSON kein Array ist, wie in Ihrer Frage, ich war mir nicht sicher, ob dies erforderlich war, da dies auch gültiges JSON ist.


Ich habe die Antwort von @DavidG oben verwendet, brauchte aber eine Implementierung für ReadJson. Folgendes habe ich zusammengestellt:

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