飞镖 - 'String' 型不是 'Iterable<dynamic>' 型的子类型



我正在尝试解析dart中的本地JSON文件并显示其值。

user.json

[
{
"id": 1,
"name": "Greg",
"imageUrl": "assets/images/greg.jpg"
},
{
"id": 2,
"name": "James",
"imageUrl": "assets/images/james.jpg"
}
]

这是我的聊天.json

[
{
"sender": "james",
"time": "5:30 PM",
"text": "Hey, how's it going? What did you do today?",
"isLiked": false,
"unread": true
},
{
"sender": "olivia",
"time": "4:30 PM",
"text": "Hey, how's it going? What did you do today?",
"isLiked": true,
"unread": false
}
]

这是我的信息类

class Message {
final User sender;
final String time;
final String text;
final bool isLiked;
final bool unread;
Message({
this.sender,
this.time,
this.text,
this.isLiked,
this.unread,
});
factory Message.fromJson(Map<String, dynamic> parsedJson){
return Message(
sender: User.fromJson(parsedJson['sender']),
time : parsedJson['time'],
text : parsedJson ['text'],
isLiked : parsedJson['isLiked'],
unread : parsedJson ['unread'],      
);
}
static List<User> parseUsers(usersJson) {
List<User> usersList = new List<User>.from(usersJson);
return usersList;
}
}

这是我的用户类

class User {
final int id;
final String name;
final String imageUrl;
User({
this.id,
this.name,
this.imageUrl,
});
factory User.fromJson(Map<String, dynamic> parsedJson){
return User(
id: parsedJson['id'],
name : parsedJson['name'],
imageUrl : parsedJson ['imageUrl']
);
}
}

这是我最新的_聊天.dart(StatefulWidget(

List<Message> _messages = List<Message>();
Future<String> _loadChatsAsset() async {
return await rootBundle.loadString('assets/json/chats.json');
}
Future<List<Message>> loadChats() async {
String jsonString = await _loadChatsAsset();
var messages = List<Message>();
final messagesJson = json.decode(jsonString);
for (var messageJson in messagesJson){
messages.add(Message.fromJson(messageJson));
}
return messages;
}
@override
void initState() {
loadChats().then((value) {
setState(() {
_messages.addAll(value);
});
});
super.initState();
}

要从我的JSON打印一些东西,我通常会执行_messages[index].sender.name或_messages[index].text等操作。

上面的解析方法在没有嵌套对象的情况下工作(仅适用于User(。使用嵌套对象(消息中的用户(,我无法识别以下错误的来源。

类型"String"不是类型"Iterable"的子类型

它发生在的这行代码上

List-usersList=new List.from(usersJson(;

我不确定我遗漏了什么。你能帮忙吗?提前感谢

正如在json中可以看到的那样,您只得到作为发送方的字符串,但当您创建Message对象时,User类需要三个参数。

这意味着,作为json中的发送方,应该有一个用户对象。

{
"id" : 1
"name" : "Viren"
"imageUrl" : 'someurl'
}

您的json和您的愿望输出不匹配

此外,你的底线也是错误的。

sender: parseUsers(parsedJson['sender']),

更改为此。

sender: User.fromJson(parsedJson['sender'])

更新:

您的json应该如下所示。

[
{
"sender": {
"id": 1,
"name": "Greg",
"imageUrl": "assets/images/greg.jpg"
},
"time": "5:30 PM",
"text": "Hey, how's it going? What did you do today?",
"isLiked": false,
"unread": true
},
{
"sender": {
"id": 2,
"name": "James",
"imageUrl": "assets/images/james.jpg"
},
"time": "4:30 PM",
"text": "Hey, how's it going? What did you do today?",
"isLiked": true,
"unread": false
}
]

相关内容

最新更新