我有一个 dart Map
我正在从本身包含嵌套映射的 json 转换。不幸的是,由于这些数据来自我无法控制的 Web 服务,因此有时某些嵌套值实际上为空。
例如,如果我有一个如下定义的值:
data = json.decode(response.body) as Map;
if (data["media_details"]["sizes"]["thumbnail"]["source_url"]
..有时
["thumbnail"]
值实际上将为空。除了乏味地走下 Map 并检查之外,是否有一种简洁的方法可以在这些情况下检查 null:
if (data["media_details"] != null) {
if(data["media_details["sizes"] != null) {
//etc
我不确定 dart 的空感知运算符是否在这种情况下有用,但我有兴趣了解它们是否有用。
最佳答案
目前没有简洁的方法来避免 []
查找的重复空检查。我们希望在以后的版本中将其添加到 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;
看起来更好,一个好的优化编译器应该能够避免分配。
关于dart - 检查嵌套的 Dart Map 是否有空值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56421781/