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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:59:24