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 值和例外情况。