我有一个飞镖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感知运算符是否适用于此类情况,但有兴趣了解它们是否适用。
答案 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}}