es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Traductor español: No funciona jsonEncode con extensiones de enumeración; ¿hay alguna solución alternativa?

En Dart (2.15.0), estoy tratando de usar jsonEncode con enumeraciones al definir un método toJson. Y no está funcionando.

import 'dart:convert';

enum Day { monday, tuesday }

extension ParseToJsonString on Day {
  String toJson() {
    return this.toString().split('.').last;
  }
}

class Saturday {
  String toJson() => "WOOHOO Saturday";
}

main() {
  //funciona!
  Saturday s=Saturday();
  print(s.toJson());
  print(jsonEncode(s));

  Day m = Day.monday;
  print(m.toJson()); //imprime 'monday'
  print(m); //imprime Day.monday
  print(jsonEncode(m)); // Error no capturado: Converting object to an encodable object failed: Instance of 'Day'
}

Según la documentación, jsonEncode buscará el método toJson.

Y las extensiones funcionan cuando se llaman directamente en una enumeración, pero de alguna manera jsonEncode no está encontrando el toJSON.

¿Alguna idea si esto es un error o el comportamiento esperado?

De lo contrario, ¿puedo usar enumeraciones y de alguna manera definir algo que funcione con jsonEncode?

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que jsonEncode no detecta la extensión del método definida en el enum Day. Este comportamiento podría ser intencional, pero no está claro en la documentación.

    Una sugerencia sería crear un convertidor personalizado para el enum Day, que pueda manejar el método toJson. Aquí tienes un ejemplo:

    import 'dart:convert';
    
    enum Day { lunes, martes }
    
    extension ParseToJsonString on Day {
      String toJson() {
        return this.toString().split('.').last;
      }
    }
    
    class DayConverter implements JsonConverter<day, string=""> {
      const DayConverter();
    
      @override
      Day fromJson(String json) {
        return Day.values.firstWhere(
          (day) => day.toJson() == json,
          orElse: () => null,
        );
      }
    
      @override
      String toJson(Day object) {
        return object.toJson();
      }
    }
    
    main() {
      final DayConverter dayConverter = const DayConverter();
      Day m = Day.lunes;
      print(m.toJson()); // imprime 'lunes'
      print(jsonEncode(m, toEncodable: dayConverter.toJson)); // ¡funciona!
      print(jsonDecode('["lunes"]', reviver: dayConverter.fromJson)); // [Day.lunes]
    }
    

    En este ejemplo, definimos un convertidor personalizado para el enum Day que mapea entre el enum Day y su representación en JSON. Luego podemos pasar este convertidor a jsonEncode y jsonDecode usando los parámetros toEncodable y reviver, respectivamente.

    ¡Espero que esto sea de ayuda!</day,>

Comments are closed.