带有 dart 数据类生成器扩展的 Json 序列化

Posted

技术标签:

【中文标题】带有 dart 数据类生成器扩展的 Json 序列化【英文标题】:Json serialization with dart data class generator extension 【发布时间】:2021-11-08 12:19:27 【问题描述】:

我正在尝试从 api(在本例中为 jsonplaceholder)获取数据。数据的响应是地图列表。我正在尝试检索 id、title 和 body 作为示例。

我有这个有效的代码:

Future<List<Post>> fetchPosts() async 
    final res = await http.get(
      Uri.parse('https://jsonplaceholder.typicode.com/posts'),
    );

    final List<dynamic> parsedPosts = json.decode(res.body);
    return parsedPosts.map((parsedPost) 
      return Post.fromMap(parsedPost);
    ).toList();
  

但是,我想使用 dart 数据类生成器扩展。他们为我的模型提供的 json 序列化的 sn-p 是这样的:

class Post 
  final String title;
  final String body;
  final int id;

  Post(
    required this.title,
    required this.body,
    required this.id,
  );

  Map<String, dynamic> toMap() 
    return 
      'title': title,
      'body': body,
      'id': id,
    ;
  

  factory Post.fromMap(Map<String, dynamic> map) 
    return Post(
      title: map['title'],
      body: map['body'],
      id: map['id'],
    );
  

  String toJson() => json.encode(toMap());

  factory Post.fromJson(String source) => Post.fromMap(json.decode(source));

这里有趣的是他们在类本身中进行解码。这就是我卡住的地方。我不确定如何以与没有此扩展提供的 sn-p 相同的方式获取数据。

也许我只是完全误解了,但我认为这个想法是循环访问 get 请求的结果,然后在其中调用 fromjson 方法。但是, res.body 被认为是一个字符串,我相信 json.decode 实际上是允许我们对其进行循环的原因。

我尝试使用传入的 res.body 为 post.fromjson 分配一个变量,但这也不起作用。

Quicktype 似乎也有这种语法,但他们的解释对于如何实际使用它并不是很有帮助。

// To parse this JSON data, do
//
//     final post = postFromMap(jsonString);

我不知道 postFromMap 指的是什么。我会很感激任何帮助:)

编辑:这几乎就是我想要实现的目标:https://***.com/a/62244941/9453618

但是,我收到错误 Unhandled Exception: type 'List' is not a subtype of type 'Map'

【问题讨论】:

你想在列表中显示这个数据吗? 【参考方案1】:

试试下面的代码,我想你的问题已经解决了。

或者如果您从 API 获取数据,请参考我的回答 here 或 here 或 here 希望对您有所帮助

声明API调用函数:

  Future<List<dynamic>> getJobsData() async 
    String url = 'https://jsonplaceholder.typicode.com/posts';
    var response = await http.get(Uri.parse(url), headers: 
      'Content-Type': 'application/json',
      'Accept': 'application/json',
    );
    return json.decode(response.body);
  

您的小部件:

 Column(
    children: [
      Expanded(
        child: Center(
          child: FutureBuilder<List<dynamic>>(
            future: getJobsData(),
            builder: (context, snapshot) 
              if (snapshot.hasData) 
                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: ListView.builder(
                    itemCount: snapshot.data.length,
                    itemBuilder: (context, index) 
                      var title = snapshot.data[index]['title'];
                      var body = snapshot.data[index]['body'];
                      var id = snapshot.data[index]['id'];
                      var userId = snapshot.data[index]['userId'];
                      return Card(
                        shape: RoundedRectangleBorder(
                          side: BorderSide(color: Colors.green.shade300),
                          borderRadius: BorderRadius.circular(15.0),
                        ),
                        child: Column(
                          children: [
                            ListTile(
                              leading: Text(id.toString()),
                              title: Text(title),
                              subtitle: Text(
                                body,
                              ),
                              trailing: Text(userId.toString()),
                            ),
                          ],
                        ),
                      );
                    ,
                  ),
                );
              
              return CircularProgressIndicator();
            ,
          ),
        ),
      ),
    ],
  ),

您的屏幕结果:

【讨论】:

这不是我的问题。我在使用扩展提供的 fromJson 方法时遇到问题factory Post.fromJson(String source) =&gt; Post.fromMap(json.decode(source)); 试试this我的回答

以上是关于带有 dart 数据类生成器扩展的 Json 序列化的主要内容,如果未能解决你的问题,请参考以下文章

FlutterJSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )

Flutter JSON 序列化 - 不生成 *.g.dart 文件

为啥 build_runner 在 dart/flutter 中序列化 JSON 时不生成文件

Dart(*)JSON序列化

Dart-RPC:使用 Protocol Buffers 序列化而不是 JSON

如何在 Dart 中使用 json_annotation 将 Uint8List 序列化为 json?