检查嵌套的Dart地图是否为空

时间:2019-06-03 05:52:51

标签: dart

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

例如,如果我的值定义如下:

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

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

在这些情况下,除了乏味地走下地图并进行检查之外,是否有一种简便的方法来检查null:

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

//etc

我不确定dart的null感知运算符是否适用于此类情况,但有兴趣了解它们是否适用。

2 个答案:

答案 0 :(得分:1)

当前没有简洁的方法来避免对[]查找进行重复的空检查。我们希望在以后的版本中将其添加到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;

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

答案 1 :(得分:1)

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

{{1}}