En una aplicación .NET, tengo un conjunto de valores que se almacenan como una [Flags] enum . Quiero serializarlos en json, pero en lugar de que el resultado sea un número entero, me gustaría obtener una matriz de cadenas para las banderas que están activas.
Así que si tengo el siguiente código
[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 }); } Quiero que el método Serialize() regrese:
"{ Flags: [ "Val1", "Val4" ] }"En vez de:
"{ Flags: 5 }"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 }Producción:
{"Banderas":"Val1, Val4"}
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 junté:
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; }