json - 后台大JSON的优化解析
问题描述
我正在解析类似于这样的大型 JSON数据。
这里有大约 3000 多个chapter
对象。我只需要那些chapter
带有 的对象"lang_code":"gb"
,大约 1300 个带有一些基本对象,例如title
, description
。所以基本上 55% 的 JSON 不适合我使用。
我正在使用https://app.quicktype.io/生成用于 JSON 解析的类, 它为我提供了正确的类,但这种方法太慢了。
任何加快速度的建议。
解决方案
如果您需要的大部分信息都很稀疏,那么最好有针对性地挑选出来,而不是为所有内容创建对象。
您无法绕过解码整个 json 字符串,这在我的笔记本电脑上大约需要 60 毫秒。修剪非 gb 章节只需要几毫秒,而将剩下的内容映射到一些可用对象则需要几毫秒。可用的总时间:<70ms。
import 'dart:convert';
import 'dart:io';
main() {
String manga = new File('manga.json').readAsStringSync();
int t1 = DateTime.now().millisecondsSinceEpoch;
Map<String, dynamic> data = json.decode(manga);
Map<String, dynamic> jChapters = data['chapter'];
jChapters.removeWhere((_, m) => m['lang_code'] != 'gb');
Map<String, Chapter> chapters = jChapters.map((_, m) {
String number = m['chapter'];
return MapEntry(number, Chapter(number, m['title']));
});
int t2 = DateTime.now().millisecondsSinceEpoch;
print(t2 - t1);
print(chapters);
}
class Chapter {
String number;
String title;
Chapter(this.number, this.title);
@override
String toString() => 'Chapter #$number:$title';
}
推荐阅读
- php - 试图在类“Symfony\Component\HttpFoundation\JsonResponse”上调用方法“fromJsonString”
- machine-learning - 如果我只有一个输出,那么随着时间的推移反向传播的误差项是什么?
- c - 在 PostgreSQL 中,如何根据 C 函数中的类型 Oid 识别类型是复合类型?
- laravel - 将 csrf 令牌从 Laravel 传递给 Vue
- qemu - 有没有办法在 kvm/qemu 中指定硬盘安装顺序?
- ios - 来自 Crashlytics 的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 错误崩溃
- c# - 常见的 Asp.Net Core 系统绘图错误
- ios - 为什么我不能在选择器视图列表中选择我的第一个数据?
- sql - 如何在更新查询中使用 SUBSTR
- android - 底部应用栏导航图标不是垂直居中