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 【问题描述】:假设有两个模型User和City
@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中使用动态链接