You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中JSON字符串转List<Post>失败,寻求技术解决方案

问题分析与解决方案

你的JSON转List<Post>失败主要有4个核心问题,逐个修正即可解决:

1. API返回的JSON字符串未解码

PostsAPI.getFeedPosts返回的是原始JSON字符串,但你直接将其当作Map访问,需要先解码:

修正后的PostsAPI代码

import 'dart:convert'; // 确保导入json库

class PostsAPI extends WebService {
  final userStorage = UserStorage();

  Future<Map<String, dynamic>> getFeedPosts() async {
    final token = await userStorage.getUserToken();

    final response = await get(
      endpoint: '/api/posts',
      token: token,
    );

    if (response.statusCode != 200) {
      if (response.statusCode == 500) {
        throw PostsServerFailure();
      }
      throw PostsRequestFailure();
    }

    // 解码JSON字符串为Map
    return json.decode(response.body) as Map<String, dynamic>;
  }
}

2. Post.fromMap的字段匹配错误

你的Post.fromMap中使用的字段名和层级与实际JSON结构不匹配,需要调整:

修正后的Post类工厂方法

factory Post.fromMap(Map<String, dynamic> map) {
  return Post(
    // JSON中作者信息在`user`字段下,而非`author`
    author: Author.fromMap(map['user'] as Map<String, dynamic>),
    // 内容URL在`content.url`层级下
    contentURL: (map['content']['url'] ?? '') as String,
    // JSON中时间字段是`createdAt`,而非`created_at`
    uploadTime: DateTime.parse((map['createdAt'] ?? '') as String),
    // 游戏名称在`game.name`层级下
    gameName: (map['game']['name'] ?? '') as String,
    description: (map['description'] ?? '') as String,
    viewCount: map['views'] as int,
    likeCount: map['likes'] as int,
  );
}

// 保留原fromJson处理字符串,新增fromJsonMap直接处理Map
factory Post.fromJson(String source) =>
    Post.fromMap(json.decode(source) as Map<String, dynamic>);

factory Post.fromJsonMap(Map<String, dynamic> map) => Post.fromMap(map);

3. Map转换时的函数引用错误

你在map中写了Post.fromJson(),这是直接调用方法而非传递函数引用,导致语法错误。需要改为传递函数或使用箭头函数:

修正后的List转换代码

Future<List<Post>> getFeedPosts() async {
  final postsAPI = await _postsAPI.getFeedPosts();

  // 先将posts转为List<dynamic>,再逐个转换为Post对象
  final postsList = postsAPI['posts'] as List<dynamic>;
  final posts = postsList
      .map((postMap) => Post.fromJsonMap(postMap as Map<String, dynamic>))
      .toList();

  return posts;
}

4. 额外检查:Author类的字段匹配

确保Author.fromMap能正确解析JSON中的user结构(比如username、avatar_border等字段),避免因Author类转换失败导致整体报错。


内容的提问来源于stack exchange,提问作者solacking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:24:57