繁体   English   中英

Flutter model 用于嵌套 json

[英]Flutter model for nested json

我正在创建一个用于数据可视化的 flutter 应用程序。 将有 3 页:

  • 过滤条件的过滤页面,
  • 用于可视化搜索结果的列表页面,
  • 详情页面。

我会收到这样的 json:

数据.json

[
    {
        "name": "Jhon",
        "surname": "Walker",
        "details": "{\"work\":{\"salary\":\"116\",\"company\":\"evolution\",\"image\":\"http://image.jpg\"},\"address\":{\"street\":\"grand station\",\"city\":\"salt lake\"}}"    
    },
    {
        "name": "Alan",
        "surname": "Turing",
        "details": "{\"work\":{\"salary\":\"116\",\"company\":\"evolution\",\"image\":\"http://image.jpg\"},\"address\":{\"street\":\"grand station\",\"city\":\"salt lake\"}}"    
    }
]

这可能是一个很长的清单。

我已经在这里发布了一个关于我的这个应用程序代码的问题,它不起作用,这里是讨论

Flutter 应用程序错误

所以现在我要问一个不同的问题。 对于这个 json 结构,哪个是最好的 model? 我需要直接访问详细信息 object 中的所有字段。 我想有能力直接拿到外地工资或公司。 我需要访问包含 url 的图像字段,以便在应用程序中显示图像。 在链接的帖子中,我使用序列化和built_value 生成了 model。 它在代码中不起作用,我仍然收到错误:

type String is not a subtype of type 'Map<String, dynamic>' in type cast

而且我在网上找到的任何解决方案似乎都不起作用。

我创建了另一个没有嵌套对象的 model,这就是我的制作方法:model.dart

class User {

  String name;

  String surname;

  String details;


  User({
    this.name,
    this.surname,
    this.details,
  });


  factory User.fromJson(Map<String, dynamic> json) => User(
    name: json["name"],
    surname: json["surname"],
    details: json["details"],
  );

  Map<String, dynamic> toJson() => {
    "name": name,
    "surname": surname,
    "details": details,
  };
}

有了这个 model,我可以在 ListView 上显示数据,但详细信息字段是唯一的一个大字符串,我不知道如何访问详细信息 object 中的字段。 我只能想到正则表达式,但这听起来有点棘手,当我有 JSON 时,为什么我应该使用正则表达式?

哪个 model 最适合这款 json? 我应该改变路径吗? 您对更好的数据 model 有什么建议,或者从我链接的讨论中正确使用数据 model 的解决方案? 我不是在问同样的问题,我只是想找到使用标准 json 访问 deatils 字段的正确解决方案。

谢谢!

这是我目前正在使用的 model 的解决方案:

model.dart

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.name,
    this.surname,
    this.areaName,
    this.details,
  });

  String name;
  String surname;
  String areaName;
  String details;

  factory User.fromJson(Map<String, dynamic> json) => User(
        name: json["name"],
        surname: json["surname"],
        areaName: json["areaName"],
        details: json["details"],
      );

  Map<String, dynamic> toJson() => {
        "name": name,
        "surname": surname,
        "areaName": areaName,
        "details": details,
      };
}

Details DetailsFromJson(String str) => Details.fromJson(json.decode(str));

String DetailsToJson(Details data) => json.encode(data.toJson());

class Details {
  Details({
    this.work,
    this.address,
  });

  Work work;
  Address address;

  factory Details.fromJson(Map<String, dynamic> json) => Details(
        work: Work.fromJson(json["work"]),
        address: Address.fromJson(json["address"]),
      );

  Map<String, dynamic> toJson() => {
        "work": work.toJson(),
        "address": address.toJson(),
      };
}

class Address {
  Address({
    this.street,
    this.city,
  });

  String street;
  String city;

  factory Address.fromJson(Map<String, dynamic> json) => Address(
        street: json["street"],
        city: json["city"],
      );

  Map<String, dynamic> toJson() => {
        "street": street,
        "city": city,
      };
}

class Work {
  Work({
    this.salary,
    this.company,
  });

  String salary;
  String company;

  factory Work.fromJson(Map<String, dynamic> json) => Work(
        salary: json["salary"],
        company: json["company"],
      );

  Map<String, dynamic> toJson() => {
        "salary": salary,
        "company": company,
      };
}

感谢您的帮助!

尝试编码您的 JSON 文件:

final data = jsonEncode(file);
final user = User.fromJson(data);

Flutter 文档包含页面上 JSON 编码/解码操作的一些有用示例。

请参阅此链接以获取适用于您的 json 的 model。

https://app.quicktype.io/

添加您的 json、select 您的语言,您就可以拥有您的 model。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM