繁体   English   中英

从 Flutter 中的嵌套 JSON 创建对象列表

[英]Creating a list of objects from a nested JSON in Flutter

有一个 URL 地址,我将其解码为 JSON,还有一个特定的 header(结果),我正在尝试将其转换为对象列表(书籍)。
当我打印这个 header 的内容时,我确实得到了想要的结果(第一次打印),但是当我创建列表并尝试打印列表中第一个 object 的字段之一时,没有打印任何内容(第二次打印)。
这意味着我创建列表的方式有问题,我找不到它。
我将衷心感谢您的帮助。

JSON结构:

{计数:9447,结果:[{book_about:字符串,book_label:字符串,book_wikilink:字符串,片段:[string1,string2,string3,string4],id:字符串,label:字符串,文本:字符串]}

它的图像: https://i.stack.imgur.com/w2JGm.png

我的代码:

Future<List<Book>> fetchBooks(http.Client client) async {

  var url = 'http://jbse.cs.technion.ac.il:3030/search?query=אברהם&start=0';
  final response = await http.get(Uri.parse(url),headers: {'Content-Type': 'application/json'});

  Map<String, dynamic> responseBody = jsonDecode(response.body);
  dynamic results = responseBody['result'];
  print(results);

  List<Book> list = results.map((book) => Book.fromJson(book)).toList();
  print(list.first.book_wikilink);
  return list;
}


class Book {
  String book_about;
  String book_label;
  String book_wikilink;
  List<String> fragments;
  String id;
  String label;
  String text;

  Book(
    this.book_about,
    this.book_label,
    this.book_wikilink,
    this.fragments,
    this.id,
    this.label,
    this.text
      );

  factory Book.fromJson(Map<String, dynamic> json) {
    return Book(
      json['book_about'],
      json['book_label'],
      json['book_wikilink'] ,
      json['fragments'],
      json['id'],
      json['label'],
      json['text'],
    );
  }
}


  

您可以手动完成。
Select 并即时转换您想要的内容(在解析期间)。

import 'package:fast_json/fast_json_selector.dart' as parser;
import 'package:http/http.dart' as http;

void main(List<String> args) async {
  final books = await fetchBooks();
  print('Found: ${books.length} book(s).');
  print(books.map((e) => e.label).join('\n'));
}

Future<List<Book>> fetchBooks() async {
  var url = 'http://jbse.cs.technion.ac.il:3030/search?query=אברהם&start=0';
  final response = await http
      .get(Uri.parse(url), headers: {'Content-Type': 'application/json'});
  return _findBooks(response.body);
}

List<Book> _findBooks(String source) {
  // Path to Book
  // Map => property "result" => List => list index => Map (Book)
  final level = '{} result [] 0 {}'.split(' ').length;
  final books = <Book>[];
  void select(parser.JsonSelectorEvent event) {
    if (event.levels.length == level) {
      final book = Book.fromJson(event.lastValue as Map);
      books.add(book);
      // Freeing the memory allocated for the book
      // because it is no longer needed
      event.lastValue = null;
    }
  }

  parser.parse(source, select: select);
  return books;
}

class Book {
  String book_about;
  String book_label;
  String book_wikilink;
  List<String> fragments;
  String id;
  String label;
  String text;

  Book(this.book_about, this.book_label, this.book_wikilink, this.fragments,
      this.id, this.label, this.text);

  factory Book.fromJson(Map json) {
    return Book(
      json['book_about'] as String,
      json['book_label'] as String,
      json['book_wikilink'] as String,
      (json['fragments'] as List).cast(),
      json['id'] as String,
      json['label'] as String,
      json['text'] as String,
    );
  }
}

Output:

Found: 10 book(s).
קדושת לוי וירא טו
חומת אנך בראשית יז כג
רא"ם בראשית כה יט
אור החיים בראשית כה יט
באר מים חיים בראשית כד לד
חזקוני בראשית כה יט
רש"י בראשית כה יט
שפתי חכמים בראשית יט כט
העמק דבר בראשית לא מב
רמב"ן בראשית כה יט

暂无
暂无

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

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