我不明白如何決議從 firebase 獲得的 JSON 檔案。
這是 JSON 檔案的格式
{
"water" : {
"-MnRJkFC3--ZOTmpF1xN" : {
"milliliters" : 0.14,
"time" : "16:26:25"
},
"-MnRJkZRwZYEInHfSKIY" : {
"milliliters" : 48.83,
"time" : "16:26:25"
},
"-MnRJksES18hY765rxxq" : {
"milliliters" : 41.44,
"time" : "16:26:25"
},
"-MnRJlDn6o4RmiGRJS-E" : {
"milliliters" : 11.37,
"time" : "16:26:25"
}
}
}
這就是我讀取 JSON 檔案的方式
Future loadSalesData() async {
final String jsonString = await getJsonFromFirebase();
final dynamic jsonResponse = json.decode(jsonString);
for (Map<String, dynamic> i in jsonResponse)
chartData.add(SalesData.fromJson(i));
}
getJsonFromFirebase() 看起來像這樣:
Future<String> getJsonFromFirebase() async {
String url =
"https://emailpassword. . .seio.com/water.json";
http.Response response = await http.get(Uri.parse(url));
return response.body;
}
當您單擊鏈接時,它會將您發送到如下所示的 JSON 檔案
{
"-Mnbk2ye2P8bfpaQvNaU": {
"milliliters": 0.0,
"time": "18:07:00"
},
"-Mnbk6wd-wJze8P0JknK": {
"milliliters": 0.12,
"time": "18:07:00"
},
"-Mnbk7Ek629vgBu-MiLg": {
"milliliters": 44.91,
"time": "18:07:00"
},
"-Mnbk7bPuzqwsz9d5nm6": {
"milliliters": 5.43,
"time": "18:07:00"
},
"-Mnbk7v7MADi7YzEbeFI": {
"milliliters": 24.54,
"time": "18:07:00"
},
"-Mnbk8DGfqswckdsA1qP": {
"milliliters": 47.58,
"time": "18:07:00"
},
"-Mnbk8Xw2kJPxLrqCl6h": {
"milliliters": 13.98,
"time": "18:07:00"
}
}
我收到錯誤
_InternalLinkedHashMap<String, dynamic>' 不是 'Iterable' 型別的子型別
uj5u.com熱心網友回復:
使用您收到的 JSON 的形狀,json.decode將回傳一個Map<String, dynamic>(更具體地說是_InternalLinkedHashMap<String, dynamic>專業化的實體)。這種型別沒有實作Iterable,所以你不能直接用for-in構造迭代它,這就是你在運行時得到的確切錯誤。
根據構建SalesData實體的需要,您有兩種選擇:
- 遍歷
entries屬性,如果你需要的key每個專案(的"-Mnbk2ye2P8bfpaQvNaU","-Mnbk6wd-wJze8P0JknK"等等),否則, - 迭代
values屬性,如果你不
參賽作品
迭代:
for (MapEntry<String, dynamic> i in jsonResponse.entries) {
chartData.add(SalesData.fromJson(i));
}
SalesData.fromJson:
SalesData.fromJson(MapEntry<String, dynamic> data) {
id = data.key;
milliliters = data.value['milliliters'];
time = data.value['time'];
}
價值觀
迭代:
for (Map<String, dynamic> i in jsonResponse.values) {
chartData.add(SalesData.fromJson(i));
}
SalesData.fromJson:
SalesData.fromJson(Map<String, dynamic> data) {
milliliters = data['milliliters'];
time = data['time'];
}
型別推斷
此外,無論您決定如何迭代Map實體,您都可以利用 Dart 的型別推斷稍微清理代碼,因此(假設您正在迭代條目)loadSalesData可能會變成:
Future loadSalesData() async {
final jsonString = await getJsonFromFirebase();
final jsonResponse = json.decode(jsonString);
for (final i in jsonResponse.entries) {
chartData.add(SalesData.fromJson(i));
}
}
并且getJsonFromFirebase可能變成:
Future<String> getJsonFromFirebase() async {
final url = "http://localhost:8080/data.json";
final response = await http.get(Uri.parse(url));
return response.body;
}
uj5u.com熱心網友回復:
似乎flutter不明白這jsonResponse是iterable因為您將其定義為dynamic.
調整定義以告訴 flutter 它是一張地圖:
final Map<String, dynamic> jsonResponse = json.decode(jsonString);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/349106.html
標籤:json 火力基地 扑 镖 Firebase 实时数据库
上一篇:處理房間資料庫物體的json
