dart 如何在freezed中通过一个字段获取两个json值?

k2fxgqgv  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(131)

假设我在freezed中有一个模型类,

@freezed
abstract class Dto implements _$Dto {
  const factory Dto({
    String? name,
    String? url,
  }) = _Dto;

  factory Dto.fromJson(Map<String, dynamic> json) =>
      _$DtoFromJson(json);
}

现在,JSON响应是
1.

{
      "name": "superuser root",
      "display_picture_url": "/media_server/user.jpg"
   }
{
      "name": "superuser root",
      "picture_url": "/media_server/user.jpg"
   }

没有freezed,我是这样写的,

factory Dto.fromJson(Map<String, dynamic> json) => Dto(
          name: json["name"],
          value: json.containsKey('display_picture_url')
              ? json["display_picture_url"] :
                json["picture_url"] 
        ),
      );

但是在freezed中,我如何才能实现这一点?
我试过使用JsonConverters,但我不知道如何处理这种情况!

sqxo8psd

sqxo8psd1#

您可以使用@JsonKeyreadValue参数来执行此操作。
引用自readValue文档:
有时,定制此行为以支持替代名称或支持需要一次访问多个值的逻辑是很方便的。

示例:

Dto/Model设置:

Object? _urlReader(Map json, String key) {
  if (key == 'picture_url') {
    return json['picture_url'] ?? json['display_picture_url'];
  }

  return json[key];
}

@freezed
class Dto with _$Dto {
  const factory Dto({
    String? name,
    @JsonKey(name: 'picture_url', readValue: _urlReader) String? url,
  }) = _Dto;

  factory Dto.fromJson(Map<String, dynamic> json) => _$DtoFromJson(json);
}
测试:
Future<void> testJson() async {
  const json = """
  [
    {
      "name": "Name 01",
      "picture_url": "https://picture.url"
    },
    {
      "name": "Name 02",
      "display_picture_url": "https://display.picture.url"
    }
  ]
  """;
  final decodedJson = jsonDecode(json) as List<dynamic>;

  final models = decodedJson.map((e) {
    return Dto.fromJson(e);
  });

  debugPrint("$models");
}
testJson()输出:
(Dto(name: Name 01, url: https://picture.url), Dto(name: Name 02, url: https://display.picture.url))

相关问题