Flutter:使用 json_serializable 将 json 转换为模型时出现问题

Posted

技术标签:

【中文标题】Flutter:使用 json_serializable 将 json 转换为模型时出现问题【英文标题】:Flutter: Issue while converting json to model using json_serializable 【发布时间】:2021-08-04 23:31:17 【问题描述】:

假设有两个模型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 模型,在映射期间,它会引发异常。type Null 不是 String 类型的子类型。 (因为这里 name 键在 city 对象中丢失)

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢Abdur的回复,但是你不觉得应该是json_serializable的默认行为吗?我使用 Unbox 库进行 ios 开发,它的工作原理就是这样。 @HimanshuArora 我猜这不是默认行为,因为可为空的值并不意味着它将始终为空,并且可能存在用户想要解析传入的 json 的情况,其中可能包含一个密钥空值。例如用户的最爱。 如果你的 json 不包含它的密钥,我猜 json_serializable 会忽略 City。虽然我不确定,因为我从未测试过这种情况。 我不太明白你的意思。如果要解析列表,请将其发布为不同的问题。 @HimanshuArora

以上是关于Flutter:使用 json_serializable 将 json 转换为模型时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 使用 google_sign_in 库时未找到 <Flutter/Flutter.h>

Flutter——如何使用 html 链接渲染 Flutter 文本 [重复]

flutter系列之:在flutter中使用导航Navigator

Flutter - 无法在flutter web中使用动态链接

无法使用 Flutter 1.22.3 编译 Flutter 应用程序

Flutter中使用flutter_html解析html文件