Decode json flutter



我有这个数据格式

message": [
{
"id": 15989,
"title": "xxx",
"body": "xxx",
"type": "abc",
"data_hash": "{"id":"3098","number":1}",
}, .....]

如果我这样写

print(message['data']['type']);

我可以得到abc,但如果我写print(message['data']['data_hash']);,我会得到无效的参数错误。为什么?

我想在data_hash中获取number

这是完整的代码

_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print("===== onMessage ====");  
try {
print(message['data']['data_hash']);
} catch (e) {
print(e.toString());
}
});

data_hash行是一个json。因此,您需要解码该行以供使用。

final data_hash_map = jsonDecode(message['data']['data_hash']);
print(data_hash_map); // { "id": 3098, "number": 1 }
print(data_hash_map["number"]); // for number

将json解码为以下

Map<String, dynamic> jsonData = jsonDecode(message)

我建议创建一个类来预定义对象,如下所示:

class Message {
int id;
String title;
String body;
String type;
DataHash dataHash;
message({this.id, this.title, this.body, this.type, this.dataHash});
Message.fromJson(Map<String, dynamic> json) {
id = json['id'];
title = json['title'];
body = json['body'];
type = json['type'];
dataHash = json['data_hash'] != null
? new DataHash.fromJson(json['data_hash'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['title'] = this.title;
data['body'] = this.body;
data['type'] = this.type;
if (this.dataHash != null) {
data['data_hash'] = this.dataHash.toJson();
}
return data;
}
}
class DataHash {
String id;
String number;
DataHash({this.id, this.number});
DataHash.fromJson(Map<String, dynamic> json) {
id = json['id'];
number = json['number'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['number'] = this.number;
return data;
}
}

您可以调用Message.fromJson(数据(进行解码。

Messsage message = Message.fromJson(data);
print(message.dataHash.number);

我希望这将正确工作

class _HomeState extends State<Mytimeoff> {
List<Map> list = [];
Map leaveRoot ={};
void getList() async {
var data = await http
.get('https:your api link');
leaveRoot = Map.from(json.decode(data.body));
setState(() {
for (Map js in leaveRoot['leavetype']) {
list.add(js);
}
});
print(jsonData);
}
@override
void initState() {
super.initState();
getList();
}

@override
Widget build(BuildContext context) {
return Scaffold();
}
}

最新更新