json - json列表排序上的颤振类型错误
问题描述
尝试对解码的 json 进行排序时出错:
发生异常。_TypeError (type '(dynamic, dynamic) => dynamic' 不是 >type '(dynamic, dynamic) => int' of 'compare' 的子类型)"
json 看起来像这样: https ://imgur.com/a/BdU3THE
我猜 sort(),它在 body 中有一个 compareTo,返回 int (-1, 1) 那就是 'dynamic, dynamic) => int' 部分,解码后的 json 默认是动态的 Map 'dynamic , 动态) => 动态',所以我需要投射一些东西。但是我看不到我的代码中的哪个函数正在返回动态?或者即使这是问题所在?
if (localData != null && localData["articles"] != null) {
the error occurs on the next line:
localData["articles"].toList().sort((a, b) =>
a["publishedAt"] != null && b["publishedAt"] != null
? b["publishedAt"].compareTo(a["publishedAt"])
: null);
}
解决方案
我为您创建了一个示例,其中有 Categories 列表并添加了 publishedAt 字段对其进行排序
这是json:
{
"Categories": [
{
"id": 1,
"name": "Restruants",
"publishedAt": "2019-05-07T00:36:38Z",
},
{
"id": 2,
"name": "Car Rental",
"publishedAt": "2019-06-07T00:36:38Z",
},
{
"id": 3,
"name": "Furniture",
"publishedAt": "2019-12-21T00:36:38Z",
},
{
"id": 4,
"name": "cars",
"publishedAt": "2019-08-10T00:36:38Z",
},
{
"id": 5,
"name": "Maintenance",
"publishedAt": "2019-03-15T00:36:38Z",
},
{
"id": 6,
"name": "Education",
"publishedAt": "2019-09-17T00:36:38Z",
},
{
"id": 7,
"name": "Finess",
"publishedAt": "2019-01-28T00:36:38Z",
},
{
"id": 8,
"name": "Electronics",
"publishedAt": "2019-09-19T00:36:38Z",
},
{
"id": 9,
"name": "Medical",
"publishedAt": "2019-12-25T00:36:38Z",
},
{
"id": 10,
"name": "Entirtainment",
"publishedAt": "2019-06-14T00:36:38Z",
}
]
}
这是模型类,当我们从 json 获取数据时,您可以在其中找到排序方法。
您可以在下面的注释中看到该方法“// TO SORT ARRAY WITH publishedAt”
class ItemModel {
List<Category> categories;
ItemModel({
this.categories,
});
factory ItemModel.fromJson(Map<String, dynamic> json){
var accJson = json["Categories"] as List;
List<Category> accList = accJson.map((i) => Category.fromJson(i)).toList();
// TO SORT ARRAY WITH publishedAt
accList.sort((a, b) {
return a.publishedAt.compareTo(b.publishedAt);
});
return ItemModel(
categories: accList
);
}
Map<String, dynamic> toJson() => {
"Categories": new List<dynamic>.from(categories.map((x) => x.toJson())),
};
}
class Category {
int id;
String name;
String publishedAt;
IconPath iconPath;
Category({
this.id,
this.name,
this.publishedAt,
this.iconPath,
});
factory Category.fromJson(Map<String, dynamic> json) => new Category(
id: json["id"],
name: json["name"],
publishedAt: json["publishedAt"],
iconPath: iconPathValues.map[json["iconPath"]],
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"publishedAt": publishedAt,
"iconPath": iconPathValues.reverse[iconPath],
};
}
下面是从资产中获取静态 json 文件列表的 Future 类,它会给你排序结果,因为我们已经在“fromJson”方法中对其进行了排序:
Future<ItemModel> fetchMovieList(BuildContext context) async {
final jsonCategory = await DefaultAssetBundle
.of(context)
.loadString('assets/CategoryList.json');
Map<String, dynamic> values = Map<String, dynamic>.from(jsonDecode(jsonCategory));
final mapJsonCategory = Map<String, dynamic>.from(values);
print(mapJsonCategory);
return ItemModel.fromJson(mapJsonCategory);
}
希望能帮助到你 :)
推荐阅读
- scala - 使用 UDF 时的任务序列化错误
- ruby-on-rails - 如何在“griddler-sendgrid”gem 中跳过 SPF 验证?
- azure - 子网内的 Azure 负载均衡器
- javascript - 在关闭浏览器窗口时通过 CGI 运行 bash 脚本
- javascript - 如何通过我的应用程序代码(即 NodeJS)将 cronjob 条目动态添加到基于 ubuntu 的容器中?
- python - 缺少一个参数时如何引发自己的错误?
- php - 只计算多级菜单的前两级
- load - 我无法使用函数 fromJSON 在 Rappid/jointJS 中加载自定义形状
- r - 按顺序匹配向量
- cmake - cmake,如何将项目添加到解决方案中?