Search code examples
jsonflutterdartbase-class

From json method in subclasses


I have a base class like:

class TransportationVehicle {
   String name;
   
   TransportationVehicle(this.name);
   
   Map<String, dynamic> toJson() {
       final Map<String, dynamic> data = <String, dynamic>{};
       data['name'] = name;
       return data;
     }
 }

And multiple sub-classes like:

class Bike extends TransportationVehicle {
   int pedals;
   
   Bike(String name, this.pedals) : super(name);
   
   @override
   Map<String, dynamic> toJson() {
     final data = super.toJson();
     data['pedals'] = pedals;
     return data;
    }
}

With that, I can transform a list of different types into a json string. But how would that work with fromJson functionality?


Solution

  • You can use the same idea from the toJson() method by using the base class.

    import 'dart:convert';
    
    class TransportationVehicle {
      final String? name;
    
      TransportationVehicle({
        this.name,
      });
    
      factory TransportationVehicle.fromRawJson(String str) =>
          TransportationVehicle.fromJson(json.decode(str));
    
      String toRawJson() => json.encode(toJson());
    
      factory TransportationVehicle.fromJson(dynamic json) => TransportationVehicle(
            name: json['name'] == null ? null : json['name'] as String,
          );
    
      Map<String, dynamic> toJson() => {
            'name': name == null ? null : name,
          };
    }
    
    class Bike extends TransportationVehicle {
      final int? pedals;
    
      Bike({
        String? name,
        this.pedals,
      }) : super(name: name);
    
      factory Bike.fromRawJson(String str) => Bike.fromJson(json.decode(str));
    
      String toRawJson() => json.encode(toJson());
    
      factory Bike.fromJson(dynamic json) {
        TransportationVehicle vehicle = TransportationVehicle.fromJson(json);
        return Bike(
          name: vehicle.name == null ? null : vehicle.name,
          pedals: json['pedals'] == null ? null : json['pedals'] as int,
        );
      }
    
      Map<String, dynamic> toJson() {
        final data = super.toJson();
        data['pedals'] = pedals == null ? null : pedals;
        return data;
      }
    }