Flutter/Dart 如何对来自 json 的地图列表进行分组
Flutter/Dart how to groupBy list of maps from json
这个问题几乎与回答的问题相同,区别在于我的数据是json,来自API称呼。这导致了下面代码底部显示的错误。我尝试了各种类型转换和变量类型的组合,但都没有成功。
import 'dart:convert';
import "package:collection/collection.dart";
void main(List<String> args) {
var data1 = [
{"title": 'Avengers', "release_date": '10/01/2019'},
{"title": 'Creed', "release_date": '10/01/2019'},
{"title": 'Jumanji', "release_date": '30/10/2019'},
];
//without these two lines, the code executes with no problems
var data2 = jsonEncode(data1);
var data3 = jsonDecode(data2);
try {
var newMap = groupBy(data3, (Map obj) => obj['release_date']);
print(newMap);
} catch (err) {
print(err);
}
**type 'List<dynamic>' is not a subtype of type 'Iterable<Map<dynamic, dynamic>>'**
[1]:
data1
的static和运行时间类型是List<Map<String, String>>
,这是从字面量的内容推断出来的。
data3
的 运行 时间类型是 List<dynamic>
,因为那是 jsonDecode
创建的。静态类型只是 dynamic
.
您不能将 List<dynamic>
传递给期望 Iterable<Map>
的对象,这是您的 groupBy
所期望的(仅从 (Map obj) => ...
函数推断,因为另一个参数的类型为 dynamic
),以及出现错误的原因。
您可以将 data3
键入为 List data3 = jsonDecode(...);
。这可能会强制类型推断猜测 dynamic
作为 groupBy
的类型参数。然后你会得到一个 (Map obj) => ...
不接受 dynamic
的错误。
无论有无上述,您都可以通过跳过类型检查将 (Map obj)
更改为 (dynamic obj)
,这应该使代码成为 运行。或者你可以做
(dynamic obj) => (obj as Map)["release_date"]
在查找之前进行转换。
您可以将 data3
键入 List
,然后通过执行 data3.cast<Map>().groupBy((Map obj) => ...)
将其转换为 List<Map>
。 (您也可以使用 groupBy
作为扩展方法,我建议这样做,但只有当接收器 data3
具有非 dynamic
类型时才有效。)
这个问题几乎与回答
import 'dart:convert';
import "package:collection/collection.dart";
void main(List<String> args) {
var data1 = [
{"title": 'Avengers', "release_date": '10/01/2019'},
{"title": 'Creed', "release_date": '10/01/2019'},
{"title": 'Jumanji', "release_date": '30/10/2019'},
];
//without these two lines, the code executes with no problems
var data2 = jsonEncode(data1);
var data3 = jsonDecode(data2);
try {
var newMap = groupBy(data3, (Map obj) => obj['release_date']);
print(newMap);
} catch (err) {
print(err);
}
**type 'List<dynamic>' is not a subtype of type 'Iterable<Map<dynamic, dynamic>>'**
[1]:
data1
的static和运行时间类型是List<Map<String, String>>
,这是从字面量的内容推断出来的。
data3
的 运行 时间类型是 List<dynamic>
,因为那是 jsonDecode
创建的。静态类型只是 dynamic
.
您不能将 List<dynamic>
传递给期望 Iterable<Map>
的对象,这是您的 groupBy
所期望的(仅从 (Map obj) => ...
函数推断,因为另一个参数的类型为 dynamic
),以及出现错误的原因。
您可以将 data3
键入为 List data3 = jsonDecode(...);
。这可能会强制类型推断猜测 dynamic
作为 groupBy
的类型参数。然后你会得到一个 (Map obj) => ...
不接受 dynamic
的错误。
无论有无上述,您都可以通过跳过类型检查将 (Map obj)
更改为 (dynamic obj)
,这应该使代码成为 运行。或者你可以做
(dynamic obj) => (obj as Map)["release_date"]
在查找之前进行转换。
您可以将 data3
键入 List
,然后通过执行 data3.cast<Map>().groupBy((Map obj) => ...)
将其转换为 List<Map>
。 (您也可以使用 groupBy
作为扩展方法,我建议这样做,但只有当接收器 data3
具有非 dynamic
类型时才有效。)