我们从元素周期表成员的类Element
开始。
import 'dart:convert' as JSON;
class Element {
String name;
Element({this.name = ""});
String toString() {
return this.name.toString();
}
}
然后我们可以解码JSON字符串
void f1() {
var jsonStr = """{ "Na": { "name": "Sodium" }, "Ca": { "name": "Calcium" } }""";
final json = JSON.jsonDecode(jsonStr);
print(json.runtimeType); // MappedListIterable<dynamic, dynamic>
final elements = json.map((key, value) => MapEntry(key, Element(name: value['name'])));
print(elements.runtimeType); // _InternalLinkedHashMap<dynamic, dynamic>
}
但假设我们想要指定结果的类型:
Map<String, Element> f3() {
var jsonStr = """{ "Na": { "name": "Sodium" }, "Ca": { "name": "Calcium" } }""";
final json = JSON.jsonDecode(jsonStr);
final elements = Map<String, Element>.fromIterable(json,
key: (k, v) => k,
value: (k, v) => Element.fromJson(name: v['name'])
);
return elements;
}
如何避免以下错误?
Error: The argument type 'String Function(dynamic, dynamic)' can't be assigned
to the parameter type 'String Function(dynamic)?'.
以确保返回的对象的类型为Map<String, Element>
?
Map<K, V>.fromIterable
的签名是:
Map<K, V>.fromIterable(
Iterable iterable,
{K key(
dynamic element
)?,
V value(
dynamic element
)?}
)
注意,key:
和value:
都只接受一个参数的函数。key
的想法是从您的迭代中提取一个元素,并从中生成Key
——在您的情况下,是String
。然后,对于value
回调,您使用相同的元素并从中生成Value
——在您的情况下,是Element
。
此外,映射是不可迭代的,但map.entries是,因此您需要迭代json.entries
,而不仅仅是json
。
因此,以下内容应该可以完成任务:
final elements = Map<String, Element>.fromIterable(json.entries,
key: (entry) => entry.key,
value: (entry) => Element(name: entry.value['name']),
);