json 派生类的属性未获取值

x759pob2  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(117)

假设有一个abstractCar类和一个派生的Cabrio类。
他从REST API接收到一个包含数据的JSON

abstract class Car {
  int id;
  String name;
  String description;

  Car({
    this.id,
    this.name,
    this.description,
  });

  factory Car.fromJson(Map<String, dynamic> json, String type) {
    Car car;
    if (type == 'cabrio') car = Cabrio.fromJson(json);
    // other possible if-statements
    car.id = int.parse(json['id']);
    car.name = json['name'];
    car.description = json['description'];
    return car;
  }

class Cabrio extends Car {
  String roofMaterial;
  String someOtherProp;

  Cabrio({
    id,
    name,
    this.roofMaterial,
    this.someOtherProp
  }) : super(
            id: id,
            name: name,
            description: description);

  factory Cabrio.fromJson(Map<String, dynamic> json) =>
    Cabrio(
        roofMaterial: json['roof_material'],
        someOtherProp: json['some_other_prop']
    );
}

dynamic dyn = jsonDecode(response.body);
Cabrio cabrio = Car.fromJson(dyn[0], 'cabrio');
cabrio.roofMaterial // null  
cabrio.someOtherProp // null 
return cabrio;

为什么cabrio.roofMaterialcabrio.someOtherPropnull

我为什么采取这种方法

我不喜欢看到

id: json['id']

这种方法是为了防止这种冗余
我知道的

  • 根据调试器,派生类Cabrio的属性由其fromJson中的json值正确设置
  • car.name = json['name']检查car对象时,派生类的属性(如cabrio.roofMaterial)已经是null

我认为是个问题
位于

if (type == 'cabrio') car = Cabrio.fromJson(json, type);

我正在将一个cabrio对象“推入"一个Car对象(它的属性比Cabrio少)。但这应该不会错,因为它只是一个父类类型

xzlaal3s

xzlaal3s1#

在本例中,您需要在调用Car.fromJson(...)后进行显式类型转换,以确保您处理的类型是具有额外字段的Cabrio,而不是Car的示例
final cabrio = Car.fromJson(json, 'cabrio') as Cabrio;
我花了一些时间将您的代码更新为Dart的更新版本,并进行了必要的更改,以确保这些字段不再为空
https://gist.github.com/MarkOSullivan94/60ce6625538e16f373c5c1d6254952e9

相关问题