有没有办法为toJson和fromJson方法返回不同的键名,json_serialized

问题描述 投票:0回答:3

是否可以使用 json_serialized 并为 toJson 和 fromJson 的同一字段使用不同的键名称。

ex json-数据:

{
"idUser": 123,
/// some other fields
}

从其他 API 传入 json_data

{
"id" : 123,
/// some other fields
}
@JsonSerializable()
class Id extends INetworkModel<Id> {
  Id(this.idUser);

  final int? idUser;

  @override
  Id fromJson(Map<String, dynamic> json) => _$IdFromJson(json);

  @override
  Map<String, dynamic>? toJson() => _$IdToJson(this);
}

对于特定的 id 字段,我想将其映射为 toJson 的 idUser 和 fromJson 的 id。

根据我在 json_serialized 文档中看到的内容,可以使用自定义 toJson 和 fromJson 方法来操作字段值,但没有看到任何其他选项来根据该方法操作 JSON 中的键名称。

如果有人启发我,我将非常高兴,谢谢!

flutter dart json-serializable
3个回答
1
投票

为同一属性提供两个来源的另一种方法:

将两者解析为可为空,并使用 getter 来检索值。比如:

@JsonSerializable()
class Id extends INetworkModel<Id> {
  Id(this.idUser, this.id);

  final int? idUser;
  final int? id;
  int? get theUserId => id ?? isUser;


  @override
  Id fromJson(Map<String, dynamic> json) => _$IdFromJson(json);

  @override
  Map<String, dynamic>? toJson() => _$IdToJson(this);
}

0
投票

不推荐,但你可以这样做

前往

yourfile.g.dart

part of 'yourfile.dart';

正如您所说,我想将其映射为 toJson 的 idUser 和 fromJson 的 id。

Id _$IdFromJson(Map<String, dynamic> json) => Id(
      idUser: json['id'] as int,
     // your rest of fields
    );

Map<String, dynamic> _$IdToJson(Id instance) => <String, dynamic>{
      'id': idUser,
      // your rest of fields
    };

0
投票

readValue
中的
JsonKey
参数可用于区分用于
fromJson
的键与用于
toJson
的主键。

@JsonSerializable()
class Id extends INetworkModel<Id> {
  Id(this.idUser);

  // Create a static method for `readValue`
  static int? readId(Map<dynamic, dynamic> json, String name) {
    // When used by `idUser` in this context, `name` would be "idUser".
    // We can ignore that and just grab a value from the key that we want.
    return json["id"];
  }

  // "idUser" or whatever name given in the `JsonKey`'s `name` parameter will still be used for `toJson`.
  @JsonKey(readValue: readId)
  final int? idUser;

  @override
  Id fromJson(Map<String, dynamic> json) => _$IdFromJson(json);

  @override
  Map<String, dynamic>? toJson() => _$IdToJson(this);
}
© www.soinside.com 2019 - 2024. All rights reserved.