首页 > 解决方案 > Flutter:使用 json_serializable 将 json 转换为模型时出现问题

问题描述

假设有两个模型UserCity

@JsonSerializable()
class User {
    int id;
    String name;
    City? city;
}

@JsonSerializable()
class City {
   int id;
   String name;
}

现在假设在 API 调用期间,我们有一个用户模型,但在城市对象模型中,我们只得到id而不是name。像这样的东西

{
    "id": 5,
    "name": "Matthew",
    "city": {
        "id": 12
    }
}

但是由于 json_serializable 和 json_annotation 的默认性质。此 JSON 未映射到 User 模型,在映射期间,它会引发异常。
Null 类型不是 String 类型的子类型。(因为这里的城市对象中缺少名称键)

但正如我们已经在 User 对象中声明的那样,City 是可选的,我希望它应该解析带有 city 为 null 的 User JSON。

任何帮助或解决方案将不胜感激,谢谢

标签: flutterdartflutter-dependenciesdart-null-safetyjson-serializable

解决方案


目前不支持仅在序列化或仅在反序列化时忽略某个字段。您可以忽略两者,也可以不忽略。但是,我使用了一种解决方法。

  1. 在模型文件中创建一个只返回 null 的全局方法,如下所示:
T? toNull<T>(_) => null;
  1. 在您的模型中为 CityUser添加一个自定义项:JsonKey
@JsonKey(fromJson: toNull, includeIfNull: false)
City? City;

这样做是从 Json 转换时,它使用您指定的函数进行转换city并将您的值替换为 null。然后由于includeIfNull属性,它只是跳过解析。


推荐阅读