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

7

我有一个Dart的Map,我正在从JSON格式转换它,它本身包含嵌套的Map。不幸的是,由于这些数据来自我无法控制的Web服务,有时某些嵌套值实际上是null。

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

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

有时候["thumbnail"]的值实际上是null。

除了繁琐地遍历Map并检查,是否有一种简洁的方法可以检查这些情况中的null呢?

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

//etc

我不确定Dart的空安全运算符在这种情况下是否有用,但如果有用我很想学习。

2个回答

14

目前没有简洁的方法来避免在[]查找中重复进行空值检查。我们希望在以后的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;

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


感谢您在这里提供的想法,非常感激。 - larryq
@lrn感谢您的回答!有人对这个“我们希望在以后的版本中将其添加到Dart语言中。”有什么看法吗? - Tiago Santos
3
这种变化实际上是空安全功能的一部分,它将很快发布(至少在beta版中)。然后,您可以编写 data["media_details"]["sizes"]["thumbnail"]?["source_url"],如果缩略图属性为 null,则结果为 null - lrn

2
你可以使用 deep_pick 包:https://pub.dev/packages/deep_pick
data = json.decode(response.body) as Map;
  if (pick(data, "media_details", "sizes", "thumbnail", "source_url")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接