json - 从另一个 JSON 对象中提取内部 JSON 对象

标签 json api twitter dart flutter

我正在尝试使用 Twitter API 显示推文列表,使用 fromJson 工厂。

每个 tweet 对象都有一个 extended_entities 对象,它是一个 media 对象数组。

如果您不熟悉 Twitter API你可以看到所有不同的对象here .

以下是我为实现这一目标而创建的模型:

class Tweet {
  final String createdAt;
  final int id;
  final String idStr;
  final String text;
  final String inReplyToStatusIdStr;
  final String inReplyToUserIdStr;
  final TweetExtendedEntities tweetExtendedEntities;

  Tweet(
      {this.createdAt,
      this.id,
      this.idStr,
      this.text,
      this.inReplyToStatusIdStr,
      this.inReplyToUserIdStr,
      this.tweetExtendedEntities});

  factory Tweet.fromJson(Map<String, dynamic> json) {
    return new Tweet(
      createdAt: json['created_at'] as String,
      id: json['id'] as int,
      idStr: json['id_str'] as String,
      text: json['text'] as String,
      inReplyToStatusIdStr: json['in_reply_to_status_id_str'] as String,
      inReplyToUserIdStr: json['in_reply_to_user_id_str'] as String,
      tweetExtendedEntities: json['extended_entities'] as TweetExtendedEntities,
    );
  }
}

class TweetExtendedEntities {
  final List<TweetMedia> tweetMedia;

  TweetExtendedEntities({this.tweetMedia});

  factory TweetExtendedEntities.fromJson(Map<String, dynamic> json) {
    return new TweetExtendedEntities(
        tweetMedia: json['media'] as List<TweetMedia>);
  }
}

class TweetMedia {
  final String mediaType;
  final String mediaUrl;

  TweetMedia({this.mediaType, this.mediaUrl});

  factory TweetMedia.fromJson(Map<String, dynamic> json) {
    return new TweetMedia(
      mediaType: json['type'] as String,
      mediaUrl: json['media_url'] as String,
    );
  }
}

在我尝试获取 extended_entities 对象之前,一切都很好,我成功获取了 JSON 数据并对其进行了解析,但是当我尝试使用 media 对象时上面的代码,我得到这个错误:

I/flutter (29538): type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'TweetExtendedEntities' in type cast where
I/flutter (29538):   _InternalLinkedHashMap is from dart:collection
I/flutter (29538):   String is from dart:core
I/flutter (29538):   TweetExtendedEntities is from package:pubg_companion/models/tweet.dart

如何使用 factory 或任何其他方式获取嵌套的 JSON 对象?

最佳答案

Dart 不知道您的 JSON 结构将对应于您的对象,也不知道如何对应。您不能直接将 JSON(可能是 Map<String, dynamic>,但也可能是其他东西)转换为您的对象。 @betorcs 的回答是朝着正确方向的开始,但还需要更多。

这一行:

tweetExtendedEntities: json['extended_entities'] as TweetExtendedEntities,

需要

tweetExtendedEntities: TweetExtendedEntities.fromJson['extended_entities'],

还有你的TweetExtendedEntities方法应该更像这样:

factory TweetExtendedEntities.fromJson(Map<String, dynamic> json) {
  return new TweetExtendedEntities(
      tweetMedia: createTweetMediaList(json['media']));
}

static List<TweetMedia> createTweetMediaList(List json) {
  if (json == null) return null;
  if (json.isEmpty) return [];

  return json.map((tweetMediaJson) => TweetMedia.fromJson(tweetMediaJson)).toList();
}

您当然也可以查看 json_serializable如果您的需求开始变得更加复杂并且您想尝试生成其中的一些代码。

关于json - 从另一个 JSON 对象中提取内部 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49787154/

相关文章:

android - 从没有 Twitter 应用程序的 Android 应用程序发推文

api - 任何人都可以给出以编程方式使用 org.apache.maven.cli.MavenCli 的好例子吗?

javascript - 从外部元素控制 Flexslider。

javascript - 如何在 NodeJS 中添加对 Web 服务的引用

twitter - 为什么我在 Twitter 的对话 View 中看不到我的@replies?

iphone - 是否有流行的 iOS Twitter 客户端列表及其用于关注和发推文的自定义 URL 方案?

java - 我可以将 gson JsonWriter 格式化为可读的格式吗?

c# - Asp.net MVC 使用 JQuery 填充列表框?

json - Jolt 规范将父对象中的所有键应用于数组中的所有对象

java - 从 JSONArray Java 中删除条目