【问题标题】:Flutter model for nested json object嵌套 json 对象的颤振模型
【发布时间】:2022-01-05 00:02:18
【问题描述】:

我是 Flutter 的新手。我曾尝试在飞镖中开发模型类。但总是显示错误信息

Exception:type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String', tt:#0      new User.fromJson

我不明白,我的代码会在哪里出错。我想要解决方案。

我想在 dart 中转换模型类。

[
    {
        "route": {
            "routeID": "aaaaaaaa",
            "routeTitle": "bbbbbbbb"
        },
        "distributor": {
            "distributorID": "cccccccccccc",
            "distributorName": "ddddddddddd"
        },
        "visitDate": null
    }
]

我已经尝试过我的源代码。如下代码

import 'dart:convert';

List<User> userFromJson(String str) =>
    List<User>.from(json.decode(str).map((x) => User.fromJson(x)));

String userToJson(List<User> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class User {
  User({
    this.visitDate,
    this.route,
    this.distributor,
  });

  String visitDate;
  String route;
  String distributor;

  factory User.fromJson(Map<String, dynamic> json) => User(
    visitDate: json["visitDate"],
    route: json["route"],
    distributor: json["distributor"],
  );

  Map<String, dynamic> toJson() => {
    "visitDate": visitDate,
    "route": route,
    "distributor": distributor,
  };
}

Route RouteFromJson(String str) => Route.fromJson(json.decode(str));

String RouteToJson(Route data) => json.encode(data.toJson());

class Route {
  Route({
    this.routeID,
    this.routeTitle,
  });

  String routeID;
  String routeTitle;

  factory Route.fromJson(Map<String, dynamic> json) => Route(
    routeID: json["routeID"],
    routeTitle: json["routeTitle"],
  );

  Map<String, dynamic> toJson() => {
    "routeID": routeID,
    "routeTitle": routeTitle,
  };
}
Distributor DistributorFromJson(String str) => Distributor.fromJson(json.decode(str));

String DistributorToJson(Distributor data) => json.encode(data.toJson());
class Distributor {
  Distributor({
    this.distributorID,
    this.distributorName,
  });

  String distributorID;
  String distributorName;

  factory Distributor.fromJson(Map<String, dynamic> json) => Distributor(
    distributorID: json["distributorID"],
    distributorName: json["distributorName"],
  );

  Map<String, dynamic> toJson() => {
    "distributorID": distributorID,
    "distributorName": distributorName,
  };
}

如何更正我的模型类。请帮我。谢谢

【问题讨论】:

    标签: android ios flutter dart


    【解决方案1】:

    像这样改变你的用户类:

     class User {
          User({
            this.visitDate,
            this.route,
            this.distributor,
          });
        
          String visitDate;
          Route route;
          Distributor distributor;
        
          factory User.fromJson(Map<String, dynamic> json) => User(
            visitDate: json["visitDate"],
            route = json['route'] != null ? Route.fromJson(json['route']) : null;
            distributor = json['distributor'] != null
                ? Distributor.fromJson(json['distributor'])
                : null;
          );
        
          Map<String, dynamic> toJson() => {
            "visitDate": visitDate,
            if (route != null) {
              data['route'] = this.route.toJson();
            }
            if (distributor != null) {
              data['distributor'] = this.distributor.toJson();
            }
          };
        }
    

    【讨论】:

      【解决方案2】:

      您也可以查看json_serializable 包。 这样,您就不必自己编写此代码了。

      https://pub.dev/packages/json_serializable

      【讨论】:

        【解决方案3】:

        这是重写模型的方法:

        import 'dart:convert';
        
        List<User> usersFromJson(String str) =>
            List<User>.from(json.decode(str).map((x) => User.fromJson(x)));
        
        String usersToJson(List<User> data) =>
            json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
        
        class User {
          User({
            required this.visitDate,
            required this.route,
            required this.distributor,
          });
        
          String? visitDate;
          Route route;
          Distributor distributor;
        
          User.fromJson(Map<String, dynamic> json)
              : visitDate = json["visitDate"],
                route = Route.fromJson(json["route"]),
                distributor = Distributor.fromJson(json["distributor"]);
        
          Map<String, dynamic> toJson() => {
                "visitDate": visitDate,
                "route": route.toJson(),
                "distributor": distributor.toJson(),
              };
        }
        
        class Route {
          Route({
            required this.routeID,
            required this.routeTitle,
          });
        
          String routeID;
          String routeTitle;
        
          Route.fromJson(Map<String, dynamic> json)
              : routeID = json["routeID"],
                routeTitle = json["routeTitle"];
        
          Map<String, dynamic> toJson() => {
                "routeID": routeID,
                "routeTitle": routeTitle,
              };
        }
        
        class Distributor {
          Distributor({
            required this.distributorID,
            required this.distributorName,
          });
        
          String distributorID;
          String distributorName;
        
          Distributor.fromJson(Map<String, dynamic> json)
              : distributorID = json["distributorID"],
                distributorName = json["distributorName"];
        
          Map<String, dynamic> toJson() => {
                "distributorID": distributorID,
                "distributorName": distributorName,
              };
        }
        
        void main() {
          const data = '''[
            {
                "route": {
                    "routeID": "aaaaaaaa",
                    "routeTitle": "bbbbbbbb"
                },
                "distributor": {
                    "distributorID": "cccccccccccc",
                    "distributorName": "ddddddddddd"
                },
                "visitDate": null
            }
          ]''';
          final decoded = usersFromJson(data);
          final encoded = usersToJson(decoded);
          print(decoded);
          print(encoded);
        }
        

        一些注意事项。

        您似乎在使用过时的 dart 版本。我建议将项目中的 dart 版本更新为 2.14.0,这是当前最新的主要版本。您可能必须运行 flutter upgrade 才能这样做。您可以在 pubspec.yaml 文件中更改 dart 的版本。 dart 版本的设置如下所示:

        environment:
          sdk: ">=2.14.0 <3.0.0"
        

        您在代码中遇到的主要问题是,在您的 User 类中,您已将 routedistributor 定义为 String 类型,而实际上,您希望它们为 Route 类型和Distributor。在 User 类的构造函数中,表达式 json["route"] 将返回类似 { "routeID": "aaaaaaaa", "routeTitle": "bbbbbbbb" } 的内容,这不是 String 而是 Map&lt;String, dynamic&gt;,这就是您收到上述错误消息的原因。

        【讨论】:

          【解决方案4】:

          颤振盒!

          您只需要做简单的工作就是访问以下网站。并且需要将您想要转换的响应或地图/列表放入模型类中,其余将由服务器完成。

          顺便说一句, 对于您的 List 数据的模型类是,

          // To parse this JSON data, do
          //
          //     final routeModelClass = routeModelClassFromJson(jsonString);
          
          import 'dart:convert';
          
          List<RouteModelClass> routeModelClassFromJson(String str) => List<RouteModelClass>.from(json.decode(str).map((x) => RouteModelClass.fromJson(x)));
          
          String routeModelClassToJson(List<RouteModelClass> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
          
          class RouteModelClass {
              RouteModelClass({
                  this.route,
                  this.distributor,
                  this.visitDate,
              });
          
              Route route;
              Distributor distributor;
              dynamic visitDate;
          
              factory RouteModelClass.fromJson(Map<String, dynamic> json) => RouteModelClass(
                  route: Route.fromJson(json["route"]),
                  distributor: Distributor.fromJson(json["distributor"]),
                  visitDate: json["visitDate"],
              );
          
              Map<String, dynamic> toJson() => {
                  "route": route.toJson(),
                  "distributor": distributor.toJson(),
                  "visitDate": visitDate,
              };
          }
          
          class Distributor {
              Distributor({
                  this.distributorId,
                  this.distributorName,
              });
          
              String distributorId;
              String distributorName;
          
              factory Distributor.fromJson(Map<String, dynamic> json) => Distributor(
                  distributorId: json["distributorID"],
                  distributorName: json["distributorName"],
              );
          
              Map<String, dynamic> toJson() => {
                  "distributorID": distributorId,
                  "distributorName": distributorName,
              };
          }
          
          class Route {
              Route({
                  this.routeId,
                  this.routeTitle,
              });
          
              String routeId;
              String routeTitle;
          
              factory Route.fromJson(Map<String, dynamic> json) => Route(
                  routeId: json["routeID"],
                  routeTitle: json["routeTitle"],
              );
          
              Map<String, dynamic> toJson() => {
                  "routeID": routeId,
                  "routeTitle": routeTitle,
              };
          }
          

          List/Map to Model class

          【讨论】:

            猜你喜欢
            • 2021-05-02
            • 2020-11-15
            • 2022-11-28
            • 1970-01-01
            • 2021-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            相关资源
            最近更新 更多