检查嵌套飞镖贴图的空值

  • 本文关键字:空值 飞镖 嵌套 dart
  • 更新时间 :
  • 英文 :


我有一个飞镖Map我正在从本身包含嵌套映射的 json 转换。 不幸的是,由于此数据来自我无法控制的 Web 服务,因此有时某些嵌套值实际上是空的。

例如,如果我有一个定义如下的值:

data = json.decode(response.body) as Map;
  if (data["media_details"]["sizes"]["thumbnail"]["source_url"]

..有时["thumbnail"]值实际上为 null。

在这些情况下,除了繁琐地沿着地图走并检查以下内容之外,是否有一种简洁的方法可以检查 null:

if (data["media_details"] != null) {
 if(data["media_details["sizes"] != null) {
//etc

我不确定 dart 的 null 感知运算符在这种情况下是否有用,但我有兴趣了解它们是否有用。

目前没有简洁的方法来避免对[]查找进行重复的空检查。我们希望在以后的版本中将其添加到Dart语言中。

我能提出的最好的建议是:

 dynamic tmp;
 data = ((tmp = json["media_details"]) == null ? null 
        : (tmp = tmp["sizes"]) == null ? null
        : (tmp = tmp["thumbnail"]) == null ? null
        : tmp["source_url"];

那是。。。还是很丑的。

如果您不介意一点开销,可以创建一个帮助程序类:

class IndexWalker {
  dynamic value;
  IndexWalker(this.value);
  IndexWalker operator[](Object index) {
    if (value != null) value = value[index];
    return this;
  }
}

然后你可以做:

data = IndexWalker(json)["media_details"]["sizes"]["thumbnail"]["sources_url"].value;

看起来更好,一个好的优化编译器应该能够避免分配。

您可以使用deep_pick包:https://pub.dev/packages/deep_pick

data = json.decode(response.body) as Map;
  if (pick(data, "media_details", "sizes", "thumbnail", "source_url")

最新更新