如何在FutureBuilder中解析从localhost接收的JSON对象

如何在FutureBuilder中解析从localhost接收的JSON对象,json,flutter,http,flutter-futurebuilder,Json,Flutter,Http,Flutter Futurebuilder,我在localhost上托管了以下JSON,并试图在FutureBuilder小部件中解析它。我无法使用FutureBuilder小部件解析Json中要显示的数据。我得到的只是“文学数据模型实例”。此外,我无法获取数据快照的长度。我得到的错误是“没有为类型对象定义getter长度” 我使用以下链接为上述Json生成了模型类: 下面是生成的类。我将其修改为使用空安全性。根据JSON的映射对象列表在LiteratureDataModel工厂构造函数中成功打印。因此,数据被成功接收 class Li

我在localhost上托管了以下JSON,并试图在FutureBuilder小部件中解析它。我无法使用FutureBuilder小部件解析Json中要显示的数据。我得到的只是“文学数据模型实例”。此外,我无法获取数据快照的长度。我得到的错误是“没有为类型对象定义getter长度”

我使用以下链接为上述Json生成了模型类:

下面是生成的类。我将其修改为使用空安全性。根据JSON的映射对象列表在LiteratureDataModel工厂构造函数中成功打印。因此,数据被成功接收

class LiteratureDataModel {
  LiteratureDataModel({
    this.ultLiteratureDataModel,
  });

  final List<LiteratureModel>? ultLiteratureDataModel;

  factory LiteratureDataModel.fromJson(Map<String, dynamic> json) => LiteratureDataModel(
    ultLiteratureDataModel: List<LiteratureModel>.from(json["data"].map((data) {
      print(data);
      return LiteratureModel.fromJson(data);
    })).toList(),
  );

  Map<String, dynamic> toJson() => {
    "data": List<dynamic>.from(ultLiteratureDataModel!.map((data) => data.toJson())),
  };
}

class LiteratureModel {
  LiteratureModel({
    this.authors,
    this.edition,
    this.id,
    this.pubdate,
    this.publisher,
    this.source,
    this.title,
  });

  final String? authors;
  final String? edition;
  final int? id;
  final String? pubdate;
  final String? publisher;
  final String? source;
  final String? title;

  factory LiteratureModel.fromJson(Map<String, dynamic> json) => LiteratureModel(
    authors: json["authors"],
    edition: json["edition"],
    id: json["id"],
    pubdate: json["pubdate"],
    publisher: json["publisher"],
    source: json["source"],
    title: json["title"],
  );

  Map<String, dynamic> toJson() => {
    "authors": authors,
    "edition": edition,
    "id": id,
    "pubdate": pubdate,
    "publisher": publisher,
    "source": source,
    "title": title,
  };
}
json托管在localhost上,我可以从中成功地提取json。下面是用于从本地主机获取json的类

class LiteratureService {
  LiteratureDataModel literatureFromJson(String literature) {
    //print(literature);
    return LiteratureDataModel.fromJson(json.decode(literature));
  }

  String literatureToJson(LiteratureDataModel literatureDataModel) => json.encode(literatureDataModel.toJson());

  Future fetchLiterature(http.Client client) async {
    final response = await client.get(Uri.parse("http://localhost_ip_address:8000/literature/ultliterature.json"));
    //print("Http response: ${response.body}");
    return literatureFromJson(response.body);
  }
}
我参考了以下链接来解决问题,但无法解决:

在上面的链接中,OP面临着与我类似的问题。我遵循了正确答案中建议的更改,但意识到这只是创建工厂构造函数的另一种方法,即LiteratureDataModel类中的方法。此外,我仍然无法获得数据快照的长度

我也提到了下面的链接,它显示了JSON序列化和反序列化的不同方式,但仍然无法解决这个问题


我在代码中做错了什么?关于我的代码所需更正的任何建议都会很有帮助。

我通过省略
文学数据模型
类并以以下方式更改
获取文学()
函数来解决问题:

Future<List<LiteratureModel>> fetchLiterature(http.Client client) async {
    final response =
        await client.get(Uri.parse("http://localhost_ip_address:8000/literature/literature.json"));
    List<LiteratureModel> literatureModel = List<LiteratureModel>.from(
        json.decode(response.body)["data"].map((data) => LiteratureModel.fromJson(data)).toList());
    return literatureModel;
  }
Future fetch文学(http.Client)异步{
最后答复=
等待client.get(Uri.parse(“http://localhost_ip_address:8000/literature/literature.json"));
List-literatureModel=List.from(
decode(response.body)[“data”].map((data)=>LiteratureModel.fromJson(data)).toList());
回归模型;
}
我还以此为指导对FutureBuilder进行了以下更改

builder:(上下文,异步快照)

如果有人知道如何更好地解决我贴出的问题,请告诉我

class LiteratureService {
  LiteratureDataModel literatureFromJson(String literature) {
    //print(literature);
    return LiteratureDataModel.fromJson(json.decode(literature));
  }

  String literatureToJson(LiteratureDataModel literatureDataModel) => json.encode(literatureDataModel.toJson());

  Future fetchLiterature(http.Client client) async {
    final response = await client.get(Uri.parse("http://localhost_ip_address:8000/literature/ultliterature.json"));
    //print("Http response: ${response.body}");
    return literatureFromJson(response.body);
  }
}
Future<List<LiteratureModel>> fetchLiterature(http.Client client) async {
    final response =
        await client.get(Uri.parse("http://localhost_ip_address:8000/literature/literature.json"));
    List<LiteratureModel> literatureModel = List<LiteratureModel>.from(
        json.decode(response.body)["data"].map((data) => LiteratureModel.fromJson(data)).toList());
    return literatureModel;
  }