0

我正在从在线端点获取数据。我正在使用 built_value 反序列化 JSON。但是我遇到了一个错误,我被卡住了。这是我得到的错误:

Unhandled Exception: Deserializing '[count, 2, results, [{id: 2, name: Upload Purchase orders, kpi: {id: 2, name:...' to 'TasksListResponseJModel' failed due to: Deserializing '[{id: 2, name: Upload Purchase orders, kpi: {id: 2, name: kpi}, assign: {id: ...' to 'BuiltList<Taskresult>' failed due to: Deserializing '[id, 1, name, Telkom, kpi, {id: 1, name: Telkom}, assign, {id: 2, name: cha c...' to 'Taskresult' failed due to: Deserializing '[tag]' to 'BuiltList<Tags>' failed due to: Deserializing 'tag' to 'Tags' failed due to: type 'String' is not a subtype of type 'Iterable<dynamic>' in type cast

JSON

{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 2,
            "name": "Upload Purchase orders",
            "kpi": {
                "id": 2,
                "name": "kpi"
            },
            "assign": {
                "id": 2,
                "name": "cha cha"
            },
            "team": {
                "id": 1,
                "name": "Commercial"
            },
            "site": {
                "id": 8,
                "name": "Soi"
            },
            "status": "Todo",
            "tags": [],
            "subtasks": [],
            "progress": 0,
            "files": [],
            "comments": []
        },
        {
            "id": 1,
            "name": "Telkom",
            "kpi": {
                "id": 1,
                "name": "Telkom"
            },
            "assign": {
                "id": 2,
                "name": "cha cha"
            },
            "team": {
                "id": 1,
                "name": "Commercial"
            },
            "site": {
                "id": 1,
                "name": "kasa"
            },
            "status": "Todo",
            "tags": [
                "tag"
            ],
            "subtasks": [],
            "progress": 0,
            "files": [],
            "comments": []
        }
    ]
}

这是我实现模型的方式:

我的Tasks_Model.dart

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:built_collection/built_collection.dart';
part 'TasksListResponseJModel.g.dart';


 abstract class TasksListResponseJModel implements Built<TasksListResponseJModel, TasksListResponseJModelBuilder> {

   static Serializer<TasksListResponseJModel> get serializer => _$tasksListResponseJModelSerializer;
   TasksListResponseJModel._();
   @BuiltValueField(wireName: 'count')
   int get count;
   @BuiltValueField(wireName: 'next')
   String get next;
   @BuiltValueField(wireName: 'previous')
   String get previous;
   @BuiltValueField(wireName: 'results')
   BuiltList<Taskresult> get results;


   factory TasksListResponseJModel([void Function(TasksListResponseJModelBuilder) updates]) = _$TasksListResponseJModel;

}

abstract class Taskresult implements Built<Taskresult, TaskresultBuilder> {
  Taskresult._();

  factory Taskresult([updates(TaskresultBuilder b)]) = _$Taskresult;

  @nullable
  @BuiltValueField(wireName: 'id')
  int get id;
  @nullable
  @BuiltValueField(wireName: 'name')
  String get name;
  @BuiltValueField(wireName: 'kpi')
  Kpi get kpi;
  @BuiltValueField(wireName: 'assign')
  Assign get assign;
  @BuiltValueField(wireName: 'team')
  Team get team;
  @BuiltValueField(wireName: 'site')
  Site get site;


  @BuiltValueField(wireName: 'progress')
  int get progress;
  @BuiltValueField(wireName: 'status')
  String get status;
  @BuiltValueField(wireName: 'tags')
  BuiltList<Tags> get tags;
  @BuiltValueField(wireName: 'subtasks')
  BuiltList<Subtasks> get subtasks;
  @BuiltValueField(wireName: 'files')
  BuiltList<Files> get files;
  @BuiltValueField(wireName: 'comments')
  BuiltList<Comments> get comments;

  static Serializer<Taskresult> get serializer => _$taskresultSerializer;
}

abstract class Tags implements Built<Tags, TagsBuilder> {
  Tags._();

  factory Tags([updates(TagsBuilder b)]) = _$Tags;

  @nullable
  @BuiltValueField(wireName: 'tag')
  String get tag;


  static Serializer<Tags> get serializer => _$tagsSerializer;
}

abstract class Subtasks implements Built<Subtasks, SubtasksBuilder> {
  Subtasks._();

  factory Subtasks([updates(SubtasksBuilder b)]) = _$Subtasks;

  @nullable
  @BuiltValueField(wireName: 'subtask')
  String get subtask;

  static Serializer<Subtasks> get serializer => _$subtasksSerializer;
}

abstract class Files implements Built<Files, FilesBuilder> {
  Files._();

  factory Files([updates(FilesBuilder b)]) = _$Files;

  @nullable
  @BuiltValueField(wireName: 'file')
  String get file;

  static Serializer<Files> get serializer => _$filesSerializer;
}

abstract class Comments implements Built<Comments, CommentsBuilder> {
  Comments._();

  factory Comments([updates(CommentsBuilder b)]) = _$Comments;

  @nullable
  @BuiltValueField(wireName: 'comment')
  String get comment;

  static Serializer<Comments> get serializer => _$commentsSerializer;
}


abstract class Kpi implements Built<Kpi, KpiBuilder> {
  Kpi._();
  factory Kpi([void Function(KpiBuilder) updates]) = _$Kpi;


  @nullable
  @BuiltValueField(wireName: 'id')
  int get id;
  @nullable
  @BuiltValueField(wireName: 'name')
  String get name;

  static Serializer<Kpi> get serializer => _$kpiSerializer;
}
abstract class Assign implements Built<Assign, AssignBuilder> {
  Assign._();
  static Serializer<Assign> get serializer => _$assignSerializer;
  @nullable
  @BuiltValueField(wireName: 'id')
  int get id;
  @nullable
  @BuiltValueField(wireName: 'name')
  String get name;


  factory Assign([void Function(AssignBuilder) updates]) = _$Assign;
}

abstract class Site implements Built<Site, SiteBuilder> {
  Site._();
  static Serializer<Site> get serializer => _$siteSerializer;
  @nullable
  @BuiltValueField(wireName: 'id')
  int get id;
  @nullable
  @BuiltValueField(wireName: 'name')
  String get name;

  factory Site([void Function(SiteBuilder) updates]) = _$Site;
}
abstract class Team implements Built<Team, TeamBuilder> {
  Team._();
  static Serializer<Team> get serializer => _$teamSerializer;

  @nullable
  @BuiltValueField(wireName: 'id')
  int get id;
  @nullable
  @BuiltValueField(wireName: 'name')
  String get name;

  factory Team([void Function(TeamBuilder) updates]) = _$Team;
}

我有一个 FutureBuilder 在这里检索任务:

 Future<FutureBuilder<Response>> _buildBody(BuildContext context) async {
    return FutureBuilder<Response<BuiltList<TasksListResponseJModel>>>(
      future: Provider.of<ApiService>(context).getTasks(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.hasError) {
            return Center(
              child: Text(
                snapshot.error.toString(),
                textAlign: TextAlign.center,
                textScaleFactor: 1.3,
              ),
            );
          }

          final posts = snapshot.data.body;
          return _buildPosts(context, posts);
        } else {
          return Center(
            child: CircularProgressIndicator(),
          );
        }
      },
    );
  } 

我真的很感激解释我哪里出错了。提前致谢。

4

1 回答 1

0

发生这种情况是因为您的属性之一被定义为字符串,但在运行时它不是来自响应的字符串。请检查正确定义的所有属性数据类型。在 json 序列化中,我们必须正确放置所有数据类型,否则在运行时时间序列化将失败。

例如: int 获取计数;在抽象类中定义,来自json的传入值是count:'2'(是一个字符串)。这成为序列化错误。

还要为每个模型(抽象类)创建单独的 dart 文件。

BuiltList<Tags> get tags; It is not true here because In your response was a List<String> so It should be BuiltList<String> get tags;

如果在更正后检查其他数据类型。

于 2021-02-01T15:02:43.310 回答