【问题标题】:Flutter/Dart Unhandled Exception: type 'String' is not a subtype of type 'Map<String, dynamic>' in type castFlutter/Dart 未处理的异常:类型“String”不是类型转换中“Map<String, dynamic>”类型的子类型
【发布时间】:2021-11-13 21:18:21
【问题描述】:

我将 JSON 作为字符串从 response.body 发送,但得到“未处理的异常:类型 'String' 不是类型转换中的 'Map' 类型的子类型 " 在 Flutter/Dart 中映射后出错。 如果我手动编写 JSON,代码可以工作。但是,如果我从参数中获取 JSON 作为字符串,则会出现转换错误。

我尝试将返回值转换为 List,但我猜 extractData 应该改变,卡在这里。 "s" 是 JSON 字符串。

getVacDates 函数仅用于通过映射从 JSON 中获取日期或总值,例如 [10/14/21, 10/15/21, 10/16/21...]

static List<String> getVacDates(String s) {
    final newList = jsonEncode(s);
    final extractedData = jsonDecode(newList) as Map<String, dynamic>;
    final china= extractedData['timeline'].map((e) => e["date"]);

    List<String> StringList = china.cast<String>();
    print(StringList);
    return StringList;
  }

JSON 信息如下:

{"country":"USA","timeline":

[{"total":409571117,"daily":757824,"totalPerHundred":121,"dailyPerMillion":2253,"date":"10/14/21"},

    {"total":410559043,"daily":743873,"totalPerHundred":122,"dailyPerMillion":2212,"date":"10/15/21"},    

    {"total":411028977,"daily":737439,"totalPerHundred":122,"dailyPerMillion":2193,"date":"10/16/21"},    

    {"total":411287235,"daily":731383,"totalPerHundred":122,"dailyPerMillion":2175,"date":"10/17/21"}]}

简化程序:

responseVac = await http.get('https://disease.sh/v3/covid-19/vaccine/coverage/countries/usa?lastdays=3');
        var data = MyFile.myFunction(xxx, yyy, responseVac.body);

在我的文件中:

static ChartsData myFunction(String xxx, bool yyy, String responseVac) {

List<String> getVacDates(String s) =>
          [for (final data in jsonDecode(s)['timeline']) data['date'] as String];

      print(getVacDates(responseVac));

【问题讨论】:

  • 先做newList = jsonEncode(s)然后再做jsonDecode(newList)有什么意义?此外,由于 JSON 以 [ 开头,因此解析时您的 JSON 字符串最终会返回 List&lt;dynamic&gt;
  • 因为来自stackoverflow.com/a/69955879/17393881 的序列化映射解决方案需要获取日期、总值作为列表。 (我没有其他可行的解决方案,所以我使用它)
  • 不是吗?这是一个示例,展示了如何将数据转换为 JSON 字符串,然后再将其解码回来。这不是您应该在同一方法中执行这两个步骤的示例。在你给出的这个例子中,你已经有一个 JSON 格式的字符串,所以你不应该做jsonEncode(s)
  • 但我无法将其映射到原始 json。我也发现了问题的原因。如果我手动编写 json,则代码可以工作,但如果我从参数中获取,则会出现转换错误。改成“Object s”还是一样。
  • 您确定发布的 JSON 文件吗?它以} 结尾,但以[ 开头,这使其无效,但也可能表明这部分JSON 是从其他JSON 结构中截取的?

标签: flutter dart


【解决方案1】:

不完全确定你想要得到什么,但它是这样的吗?

import 'dart:convert';

void main() {
  print(getVacDates(jsonString)); // [10/14/21, 10/15/21, 10/16/21, 10/17/21]
}

List<String> getVacDates(String s) => [
      for (final timeline in jsonDecode(s)['timeline'])
        timeline['date'] as String
    ];

const jsonString = '''{
  "country": "USA",
  "timeline": [
    {
      "total": 409571117,
      "daily": 757824,
      "totalPerHundred": 121,
      "dailyPerMillion": 2253,
      "date": "10/14/21"
    },
    {
      "total": 410559043,
      "daily": 743873,
      "totalPerHundred": 122,
      "dailyPerMillion": 2212,
      "date": "10/15/21"
    },
    {
      "total": 411028977,
      "daily": 737439,
      "totalPerHundred": 122,
      "dailyPerMillion": 2193,
      "date": "10/16/21"
    },
    {
      "total": 411287235,
      "daily": 731383,
      "totalPerHundred": 122,
      "dailyPerMillion": 2175,
      "date": "10/17/21"
    }
  ]
}''';

【讨论】:

  • 我更正了 json,它具有第二级,需要单独获取所有日期和总数。我的代码正在使用手动 json,但有些如何发送到参数有转换错误。
  • @osunkaya 更新示例以使用最近提供的 JSON。
  • @osunkaya 请在您的示例中提供更多详细信息,以便与您的问题相匹配。例如。添加一个重现您的问题的小程序。另外,请提供您的错误的完整堆栈跟踪。
  • Unhandled Exception: type '_InternalLinkedHashMap&lt;String, dynamic&gt;' is not a subtype of type 'Iterable&lt;dynamic&gt;'
猜你喜欢
  • 2021-12-29
  • 2020-06-28
  • 2019-08-07
  • 2021-07-11
  • 2021-01-17
  • 2021-02-11
  • 2022-06-26
  • 2021-06-11
  • 2021-09-07
相关资源
最近更新 更多