我正在尝试使用 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/