【问题标题】:How Flutter can decode a very large json array, Flutter just decode the only first 20 items?Flutter 如何解码一个非常大的 json 数组,Flutter 只解码前 20 项?
【发布时间】:2021-08-11 17:31:27
【问题描述】:

您好,我有一个返回一个大列表的 api,这个列表的最小长度可以是 100 或 120 个元素,并且颤振解码只有前 20 个元素是列表。 现在在您看来,我加载了一个非常大的 json 数组元素并且不关心快速的 api,req 只需要 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}';
    }
  }

感谢阅读,希望对我有所帮助

【问题讨论】:

  • 是否可以提供所有返回的 JSON,以便我们尝试看看出了什么问题?我猜您已经通过打印response.body 进行了检查,并验证了 JSON 完全有效并且不包含任何字符集问题。
  • 是的,我打印并看到响应返回了它的完整数据,但问题原因在解析它时只接受前 20 个元素或随机 20 个元素并将它们放在我的模型中的列表中。
  • 好的,您是否测试过将完整 JSON 直接粘贴到您的 dart 代码中的位置?只是为了验证问题与其他问题无关?
  • 是的,当然!这就是问题,一切工作都很棒,一切都很好,唯一奇怪的是它只将 20 个元素解析到模型列表中,所以我问自己这个问题可能与线程有关,或者问题可能是因为 api 许可证而发生的?但是如果你检查了api,它说开发人员计划不需要支付任何费用,所以我认为问题可能导致因为我在主线程中做了所有事情,所以我使用了计算方法但同样的事情发生了!你可以在 git 上查看我的代码,发给我你的邮件或者写在这里查看我的代码,如果你想查看的话
  • 我并不是真正的 Flutter 开发人员,但我可以正确地将您的代码移动到一些普通的 Dart 程序并测试 JSON 解析。您可以在我的 Github 个人资料中找到我的邮件(登录后):github.com/julemand101。我明天有点忙,所以我不能保证我会在星期一之前看它。 :)

标签: flutter http dart flutter-animation dio


【解决方案1】:

我不知道你是如何编码的,但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,但请记住返回值和异常。

【讨论】:

  • 非常感谢兄弟您解决了我的问题,我唯一想念的是阅读文档中的“pageSize”,感谢您的宝贵时间
猜你喜欢
  • 2021-07-13
  • 2022-01-18
  • 2021-12-28
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多