【问题标题】:Flutter JSON String/Int commandsFlutter JSON String/Int 命令
【发布时间】:2018-06-02 20:42:07
【问题描述】:

我正在尝试制作一个从this JSON list 检索数据 并将此数据解析listview 的应用程序。

使用下面的代码,我希望看到的第一条记录是IDNAMEPRICE,但似乎我无法检索PRICE,因为这是一个int,我正在从 JSON 列表中调用一个string

此外,'PRICE' 和 'ID' 一样是一个 int,如下所述,但 'ID' 可以很好地获取,而 'PRICE' 只是在列表视图中显示 'NULL'

我不知道如何解决这个问题,希望我能在这个平台上得到我正在寻找的答案。

FirstPage.dart:

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;

void main() {
  runApp(MaterialApp(
    home: StarWarsData(),
  ));
}

class StarWarsData extends StatefulWidget {
  @override
  StarWarsState createState() => StarWarsState();
}

class StarWarsState extends State<StarWarsData> {
  final String url = "https://api.coinmarketcap.com/v2/ticker/";
  List data;

  Future<String> getSWData() async {
    var res = await http
        .get(Uri.encodeFull(url), headers: {"Accept": "application/json"});

    setState(() {
      var resBody = json.decode(res.body);
      data = resBody["data"];
    });

    return "Success!";
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Cryp-Tick Crypto Exchange"),
        centerTitle: true,
        backgroundColor: Colors.black,
      ),
      body: ListView.builder(
        itemCount: data == null ? 0 : data.length,
        itemBuilder: (BuildContext context, int index) {
          return new Container(
            child: Center(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Card(
                    child: Container(
                        padding: EdgeInsets.all(15.0),
                        child: Row(
                          children: <Widget>[
                            Text("Id: "),
                            Text('${data[index]["id"]}',
                                style: TextStyle(
                                    fontSize: 18.0, color: Colors.black87)),
                          ],
                        )),
                  ),
                  Card(
                    child: Container(
                        padding: EdgeInsets.all(15.0),
                        child: Row(
                          children: <Widget>[
                            Text("Name: "),
                            Text('${data[index]["name"]}',
                                style: TextStyle(
                                    fontSize: 18.0, color: Colors.red)),
                          ],
                        )),
                  ),
                  Card(
                    child: Container(
                        padding: EdgeInsets.all(15.0),
                        child: Row(
                          children: <Widget>[
                            Text("Price: "),
                            Text('${data[index]["price"]}',
                                style: TextStyle(
                                    fontSize: 18.0, color: Colors.black87)),
                          ],
                        )),
                  ),
                ],
              ),
            ),
          );
        },
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    this.getSWData();
  }
}

我在调试控制台中收到的错误:

E/flutter (25480): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (25480): type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List' where
E/flutter (25480):   _InternalLinkedHashMap is from dart:collection
E/flutter (25480):   String is from dart:core
E/flutter (25480):   List is from dart:core

【问题讨论】:

  • 停止在任何地方使用 Bold ,为了获得最佳质量,请勿使用 help mei hope help me 或类似的事情,请注意每个人都知道 stackoverflow 是为了提供帮助。欲了解更多信息,请阅读此处:stackoverflow.com/help/how-to-ask
  • 好的,对不起,山姆,下次我会记住这一点的,不过有什么想法吗?
  • 如果问题与price 类型有关,您必须得到与ID 相同的错误,因为ID 也是int。对吗?
  • 哦是的没错,问题是 ID 被正确解析,但价格只是吐出'null',所以它一定是别的东西
  • flutter 网站上阅读此文档。这是本文档中的解析示例:flutter.io/cookbook/networking/background-parsing

标签: json dart flutter


【解决方案1】:

我认为问题不在于您的想法。您的数据类型为 List:

List data;

你正在这样填充它:

data = resBody["data"];

错误提示:

类型 '_InternalLinkedHashMap&lt;String, dynamic&gt;' 不是类型 'List' 的子类型

这表明 resBody["data"]` 是一个映射而不是一个列表,如果你查看你正在拉取的 URL 中的 JSON,它的开头是这样的:

{
    "data": {
        "1": {

data 对象不是列表/数组,而是对象/映射。您应该将data 变量的类型更改为Map&lt;String, dynamic&gt;,然后将数据转换为List,然后再将其存储到变量中。


在一些 cmets 之后编辑

我能够通过添加 .values.toList() 并将 JSON 剥离到前两条记录来完成这项工作:

但是,对于来自该 url 的所有 JSON,它似乎是错误的。因此,也许 JSON 中的某些内容正在触发错误。更奇怪的是,它似乎在 DartPad 中运行良好!

【讨论】:

  • 看起来不错,明天我会告诉你情况如何,因为在我的国家有点太晚了。
  • 我对这门语言还很陌生,你能举个例子说明我如何在我的代码中实现它吗?
  • 也许可以尝试将其更改为 data = resBody["data"].values;,因为该喊声会为您提供所需值的列表?
  • 好的,现在在调试控制台中,我收到此错误:E/flutter (10989): NoSuchMethodError: Class 'List' has no instance getter 'values'。 E/flutter (10989):接收者:'_GrowableList'的实例(长度:100)
  • @JakeBailey 原来您可能也需要 .toList ......但是,我仍然遇到了完整 json 的问题,但没有遇到较小的集合 - 请参阅我的编辑。我想你可能发现了一个错误。我认为 JSON 中的某些内容可能会导致 json 解码崩溃。
猜你喜欢
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2022-07-29
  • 2022-12-15
相关资源
最近更新 更多