当前位置: 首页 > 知识库问答 >
问题:

获取类型“List”不是类型“List”的子类型JSON中的错误

南门魁
2023-03-14

我正在解码一个响应体,我得到了错误:

'List<dynamic>' is not a subtype of type 'List<Example>' 

我正在解析JSON对象的JSON数组,其中一个字段也是对象列表,我怀疑我的问题源于此。我也在使用json_serializable库。下面是我的代码,我省略了一些字段,更改了一些变量名称,但它代表相同的代码:

import 'package:json_annotation/json_annotation.dart';

part 'example_model.g.dart';

@JsonSerializable()
class Example {

  (some fields here)
  final List<Random> some_urls;
  final List<String> file_urls;


  const Example({
    (some fields here)
    this.some_urls,
    this.file_urls,

  });

  factory  Example.fromJson(Map<String, dynamic> json) =>
      _$ ExampleFromJson(json);
}

@JsonSerializable()
class Random {
  final String field_1;
  final int field_2;
  final int field_3;
  final int field_4;
  final bool field_5;

  constRandom(
      {this.field_1, this.field_2, this.field_3, this.field_4, this.field_5});

  factory Random.fromJson(Map<String, dynamic> json) => _$RandomFromJson(json);
}

从。json_serializable生成的g dart文件(将编码部分复制):

Example _$ExampleFromJson(Map<String, dynamic> json) {
  return Example(

      some_urls: (json['some_urls'] as List)
          ?.map((e) =>
      e == null ? null : Random.fromJson(e as Map<String, dynamic>))
          ?.toList(),
      file_urls: (json['file_urls'] as List)?.map((e) => e as String)?.toList(),

}

Random _$RandomFromJson(Map<String, dynamic> json) {
  return Random(
      field_1: json['field_1'] as String,
      field_2: json['field_2'] as int,
      field_3: json['field_3'] as int,
      field_4: json['field_4'] as int,
      field_5: json['field_5'] as bool);
}

这是我未来的职能:

  Future<List<Example>> getData(int ID, String session) {
    String userID = ID.toString();
    var url = BASE_URL + ":8080/example?userid=${userID}";
    return http.get(url, headers: {
      "Cookie": "characters=${session}"
    }).then((http.Response response) {
      if (response.statusCode == 200) {
        var parsed = json.decode(response.body);
        List<Example> list = parsed.map((i) => Example.fromJson(i)).toList();
        return list;
      }
    }).catchError((e)=>print(e));
  }

共有3个答案

林辰钊
2023-03-14

我收到了的MappedListIterable

 var parsed = json.decode(response.body);
 var list = parsed.map((i) => Example.fromJson(i)).toList();

将解析的数据转换为List

 var parsed = json.decode(response.body) as List<dynamic>;
 var list = parsed.map((i) => Example.fromJson(i)).toList();

东郭赞
2023-03-14

错误原因:

如果源列表的类型为动态对象(比方说),并且直接将其分配给特定类型而不强制转换,则会出现此错误。

List<dynamic> source = [1]; 
List<int> ints = source; // error

解决方案:

您需要转换列表

  1. List<int> ints = List<int>.from(source);
    
    List<int> ints = List.castFrom<dynamic, int>(source);
    
    List<int> ints = source.cast<int>();
    
    List<int> ints = source.map((e) => e as int).toList();
    

东方海
2023-03-14

此代码创建一个List

parsed.map((i) => Example.fromJson(i)).toList();

必须显式强制转换列表

List<Example> list = List<Example>.from(parsed.map((i) => Example.fromJson(i)));

或者只是

var /* or final */ list = List<Example>.from(parsed.map((i) => Example.fromJson(i)));

另见

  • 在Dart中,List.from和. of,Map.from和. of有什么区别?
  • https://api.dartlang.org/stable/2.0.0/dart-core/List/List.from.html
  • https://api.dartlang.org/stable/2.0.0/dart-core/List/List.of.html
  • 飞镖2.X List.cast()不组成

 类似资料:
  • 我相信你知道上面的问题。我想知道我怎样才能解决它。我知道我的数据是列表形式的,但在我使用的数据类map中。我真的不明白我应该如何改变它的工作,基本上我只是跟随颤振。开发文档 如果你想知道我做了什么 我基本上是用json_serializable解析数据的。在使用测试数据进行的测试中,所有测试都运行良好。 我的数据: 我的模型包含一个标题,图像 ` 我正在使用以下代码使用数据: 我希望我写得清楚 -

  • 我从Firestore示例中复制了一段代码: 但是我得到了这个错误 这里出了什么问题?

  • 我是一个新手,我尝试运行一个GitHub项目,但遇到了一个错误,比如类型ListDynamic不是类型ListInt的子类型。Github链接 误差线 以上代码文件 如有任何帮助,我们将不胜感激,并提前向您表示感谢。

  • 我正在开发一个依靠API REST调用的flutter应用程序。来自API的响应有点复杂。当调用我的API(例如:api/产品)时,我可以从日志中看到响应:但是我有这个错误: 类型列表 StackTrace: [更新]:退货产品响应。fromJson(response)而不是response ProductsRespository: ProductsBloc: 回应: ApiProvider: 模

  • 我是个新手。当我运行代码时,我得到一个错误:“Future”类型不是“List”类型的子类型。如果我改变屏幕,我将得到错误:NoSuchMethodError:方法“map”被调用为null。我怎样才能解决它?谢谢你帮助我。

  • 我正在学习飞镖和颤振。现在,我尝试将JSON作为一种持久性方法。我犯了很多错误,都是关于类型和内容的。这是我遇到的最新错误: