如何用Twitter API与fromJson工厂展示推文列表并提取内部JSON对象?
看起来你正在用fromJson工厂方法处理Twitter API的推文解析,特别是要搞定extended_entities里的媒体数组对吧?我来帮你把模型补全,顺便把解析逻辑梳理清楚~
完整的推文解析模型(含fromJson实现)
我们需要分三层定义模型,对应Twitter API返回的推文主对象、扩展实体对象,以及媒体对象,这样解析起来更清晰:
1. 媒体对象模型(TweetMedia)
先处理最底层的媒体项,对应extended_entities.media里的单个元素:
class TweetMedia { final String mediaUrlHttps; final String type; // 比如"photo"、"video"、"gif" final int width; final int height; TweetMedia({ required this.mediaUrlHttps, required this.type, required this.width, required this.height, }); // 从JSON解析单个媒体对象 factory TweetMedia.fromJson(Map<String, dynamic> json) { return TweetMedia( mediaUrlHttps: json['media_url_https'], type: json['type'], width: json['width'], height: json['height'], ); } }
2. 扩展实体模型(TweetExtendedEntities)
这个类用来包裹媒体数组,对应推文里的extended_entities字段:
class TweetExtendedEntities { final List<TweetMedia> media; TweetExtendedEntities({required this.media}); factory TweetExtendedEntities.fromJson(Map<String, dynamic> json) { // 把JSON数组转成TweetMedia实例列表 final mediaList = json['media'] as List; final mediaItems = mediaList.map((item) => TweetMedia.fromJson(item)).toList(); return TweetExtendedEntities(media: mediaItems); } }
3. 主推文模型(Tweet)
现在把你开头的类补全,加上可选字段的处理(毕竟不是所有推文都有回复或媒体):
class Tweet { final String createdAt; final int id; final String idStr; final String text; final String? inReplyToStatusIdStr; // 回复相关字段可能为null final String? inReplyToUserIdStr; final TweetExtendedEntities? extendedEntities; // 无媒体的推文不会有这个字段 Tweet({ required this.createdAt, required this.id, required this.idStr, required this.text, this.inReplyToStatusIdStr, this.inReplyToUserIdStr, this.extendedEntities, }); factory Tweet.fromJson(Map<String, dynamic> json) { // 处理可选的extended_entities:存在才解析,否则为null final extendedEntities = json.containsKey('extended_entities') ? TweetExtendedEntities.fromJson(json['extended_entities']) : null; return Tweet( createdAt: json['created_at'], id: json['id'], idStr: json['id_str'], text: json['text'], inReplyToStatusIdStr: json['in_reply_to_status_id_str'], inReplyToUserIdStr: json['in_reply_to_user_id_str'], extendedEntities: extendedEntities, ); } }
4. 批量解析推文列表
当你拿到Twitter API返回的推文数组JSON后,用这个方法批量转成Tweet列表:
List<Tweet> parseTweetList(List<dynamic> tweetJsonArray) { return tweetJsonArray.map((tweetJson) => Tweet.fromJson(tweetJson)).toList(); }
几个关键提醒
- 可空字段要注意:Twitter API里很多字段是可选的(比如回复ID、媒体实体),一定要用
?标记可空类型,不然解析空字段会报错。 - 字段名要严格对应:API返回的是下划线命名(比如
created_at),模型里用驼峰的话,在fromJson里要正确映射,别写错字段名。 - 数组解析的写法:处理
media数组时,要用map遍历每个JSON对象,转换成对应的模型实例,最后转成List。
举个快速使用的例子:
// 假设这是你从API拿到的JSON数据 final sampleTweetJson = [ { "created_at": "Wed Oct 10 20:19:24 +0000 2018", "id": 1050118621198921728, "id_str": "1050118621198921728", "text": "Just setting up my Twitter. #myfirstTweet", "extended_entities": { "media": [ { "media_url_https": "https://pbs.twimg.com/media/DnQK4XcX4AA0aMy.jpg", "type": "photo", "width": 1200, "height": 675 } ] } } ]; // 解析成Tweet列表 final tweets = parseTweetList(sampleTweetJson); // 打印第一个推文的第一张图片链接 print(tweets.first.extendedEntities?.media.first.mediaUrlHttps);
如果还需要处理其他字段(比如发推用户信息、推文统计数据),只要在对应的模型里添加字段和解析逻辑就好啦~
内容的提问来源于stack exchange,提问作者argamanza
相关产品推荐
相关产品推荐

