Flutter 颤振如何解码一个非常大的json数组,颤振只解码前20项?
您好,我有一个api,它返回一个大列表,这个列表的最小长度可以是100或120个元素,而flift decode只有前20个元素是列表。 现在,在您看来,我加载了一个非常大的json数组元素,不关心api的速度,请求只需要30万秒,api是:。我使用http包加载数据,这就是我的代码Flutter 颤振如何解码一个非常大的json数组,颤振只解码前20项?,flutter,http,dart,flutter-animation,dio,Flutter,Http,Dart,Flutter Animation,Dio,您好,我有一个api,它返回一个大列表,这个列表的最小长度可以是100或120个元素,而flift decode只有前20个元素是列表。 现在,在您看来,我加载了一个非常大的json数组元素,不关心api的速度,请求只需要30万秒,api是:。我使用http包加载数据,这就是我的代码 Future getEverythingFunc({@required String query}) async { http.Response response = await http.get(Uri
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}';
}
}
Future getEverythingFunc({@required String query})异步{
http.Response-Response=wait-http.get(Uri.parse(ApiReq.everythingforsearchingur(query:query));
如果(response.statusCode>=200&&response.statusCode=400&&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.');
}
注意
wnetworking
包尚未准备好发布,它包含与API等相关的操作。您可以使用典型的http.get
替换HttpReqService.getJson
,但请记住返回值和异常
是否可以提供所有返回的JSON,以便我们可以尝试查看出了什么问题?我想您已经通过打印响应.body
进行了检查,并验证了JSON是完全有效的,并且不包含任何字符集问题。是的,我打印了,并看到响应返回了完整的数据,但问题是在解析时引起的它只接受前20个元素或随机20个元素,并将它们放在我的模型列表中。好的,你测试过你将完整的JSON直接粘贴到dart代码中的位置吗?只是为了验证这个问题与其他问题无关?是的,当然!这是个问题,一切都很好,一切都很好,唯一奇怪的是这不是仅仅解析了模型列表中的20个元素,所以我问我自己这个问题可能与线程有关,或者这个问题可能是因为api许可证而发生的吗?但是api如果你检查了它,它说开发者不需要支付任何费用,所以我认为这个问题可能是因为我在主线程中做了所有事情,所以我使用了计算方法,但同样的事情发生了n!。你可以在git上检查我的代码发送邮件给我,如果你想检查我的代码,也可以写在这里检查我的代码。我不是一个真正的颤振开发人员,但我可以正确地将你的代码移动到一些普通的Dart程序并测试JSON解析。你可以在我的Github配置文件上找到我的邮件(登录后):。我明天有点忙,所以我不能保证我会在周一之前看。:)非常感谢兄弟你解决了我的问题。我唯一错过的是阅读文档中的“页面大小”,谢谢你的时间
Fetching news... done!
News fetched: 100
Job done.