检查嵌套的 Dart Map 是否有空值

lar*_*ryq 5 dart

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

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

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

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

除了乏味地走下 Map 并检查之外,是否有一种简洁的方法可以在这些情况下检查 null:

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

//etc
Run Code Online (Sandbox Code Playgroud)

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

lrn*_*lrn 13

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

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

 dynamic tmp;
 data = ((tmp = json["media_details"]) == null ? null 
        : (tmp = tmp["sizes"]) == null ? null
        : (tmp = tmp["thumbnail"]) == null ? null
        : tmp["source_url"];
Run Code Online (Sandbox Code Playgroud)

那……还是很丑。

如果你不介意一点开销,你可以创建一个辅助类:

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

那么你可以这样做:

data = IndexWalker(json)["media_details"]["sizes"]["thumbnail"]["sources_url"].value;
Run Code Online (Sandbox Code Playgroud)

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

  • 这一变化实际上是零安全功能的一部分,该功能很快就会发布(至少在测试版中)。然后你可以编写`data["media_details"]["sizes"]["thumbnail"]?["source_url"]`,如果缩略图属性为`null`,结果为`null`。 (2认同)