Flutter 如何解码一个非常大的 json 数组,Flutter 只解码前 20 项?
How Flutter can decode a very large json array, Flutter just decode the only first 20 items?
你好,我有一个 api return 一个大列表,这个列表的最小长度可以是 100 或 120 个元素,并且只有前 20 个元素是列表。
现在在你看来我加载了一个非常大的 json 数组元素并且不关心 api 快请求只需要 300 毫秒尽可能 Api 是:https://newsapi.org/。我使用 http 包加载数据,这就是我的代码。
Future getEverythingFunc({@required String query}) async {
http.Response response = await http.get(Uri.parse(ApiReq.everyThingForSearchingUrl(query:query)));
if (response.statusCode >= 200 && response.statusCode <= 300) {
print(response.body);
return everythingModel = everythingModelFromJson(response.body);
} else if (response.statusCode >= 400 && response.statusCode <= 500) {
throw "Err while getting data ${response.statusCode}";
} else {
throw 'Unknown Err ${response.statusCode}';
}
}
感谢阅读,希望对我有所帮助
我不知道你是如何编码的,但是 jsonDecode
功能运行良好。你读过 NewsAPI 的文档吗?当省略pageSize
参数时,默认为20个结果,免费订阅的最大值为100。我已经测试过了,我的代码:
// @dart=2.13
import 'dart:async';
import 'dart:io';
import 'package:wnetworking/wnetworking.dart';
typedef JMap = Map<String, dynamic>;
class NewsAPI {
static const _base = 'https://newsapi.org/v2';
static const _apiKey = '111111111111111111111111111111';
// 'pageSize' ranges from 0 to 100 for free subscription, more size is paid
// source: https://newsapi.org/docs/endpoints/everything
static FutureOr<void> fetchNews({required keyword, int pageSize=20}) async {
final url = '$_base/everything?q=$keyword&pageSize=$pageSize&sortBy=publishedAt&apiKey=$_apiKey';
List? news;
stdout.write('Fetching news... ');
await HttpReqService.getJson<JMap>(url)
.then((response) {
if (response != null) {
news = response['articles'] as List;
}
})
.whenComplete(() {
print('done!');
print('\nNews fetched: ${news!.length}');
});
}
}
void main(List<String> args) async {
await NewsAPI.fetchNews(keyword: 'anime', pageSize: 100);
print('Job done.');
}
结果:
Fetching news... done!
News fetched: 100
Job done.
备注
wnetworking
包尚未准备好发布,它包含与 API 等相关的操作。您可以将 HttpReqService.getJson
替换为典型的 http.get
但保留请注意 return 值和例外情况。
你好,我有一个 api return 一个大列表,这个列表的最小长度可以是 100 或 120 个元素,并且只有前 20 个元素是列表。 现在在你看来我加载了一个非常大的 json 数组元素并且不关心 api 快请求只需要 300 毫秒尽可能 Api 是:https://newsapi.org/。我使用 http 包加载数据,这就是我的代码。
Future getEverythingFunc({@required String query}) async {
http.Response response = await http.get(Uri.parse(ApiReq.everyThingForSearchingUrl(query:query)));
if (response.statusCode >= 200 && response.statusCode <= 300) {
print(response.body);
return everythingModel = everythingModelFromJson(response.body);
} else if (response.statusCode >= 400 && response.statusCode <= 500) {
throw "Err while getting data ${response.statusCode}";
} else {
throw 'Unknown Err ${response.statusCode}';
}
}
感谢阅读,希望对我有所帮助
我不知道你是如何编码的,但是 jsonDecode
功能运行良好。你读过 NewsAPI 的文档吗?当省略pageSize
参数时,默认为20个结果,免费订阅的最大值为100。我已经测试过了,我的代码:
// @dart=2.13
import 'dart:async';
import 'dart:io';
import 'package:wnetworking/wnetworking.dart';
typedef JMap = Map<String, dynamic>;
class NewsAPI {
static const _base = 'https://newsapi.org/v2';
static const _apiKey = '111111111111111111111111111111';
// 'pageSize' ranges from 0 to 100 for free subscription, more size is paid
// source: https://newsapi.org/docs/endpoints/everything
static FutureOr<void> fetchNews({required keyword, int pageSize=20}) async {
final url = '$_base/everything?q=$keyword&pageSize=$pageSize&sortBy=publishedAt&apiKey=$_apiKey';
List? news;
stdout.write('Fetching news... ');
await HttpReqService.getJson<JMap>(url)
.then((response) {
if (response != null) {
news = response['articles'] as List;
}
})
.whenComplete(() {
print('done!');
print('\nNews fetched: ${news!.length}');
});
}
}
void main(List<String> args) async {
await NewsAPI.fetchNews(keyword: 'anime', pageSize: 100);
print('Job done.');
}
结果:
Fetching news... done!
News fetched: 100
Job done.
备注
wnetworking
包尚未准备好发布,它包含与 API 等相关的操作。您可以将HttpReqService.getJson
替换为典型的http.get
但保留请注意 return 值和例外情况。