我正在尝试解析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
}
]