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
相关产品推荐
相关产品推荐

