反序列化来自cloud_firestore数据库的一个非常复杂的JSON对象时遇到一些问题。我已经采取了一种相当漂亮的方式格式化该对象。所以这是它的样子:
{
"mealType": "Breakfast","id": 6,"totalCalories": 187.0,"nutritionixData": [
{
"phospate": 152.15,"totalFat": 11.11,"potassium": 173.4,"servingQuantity": 3.0,"photo": {
"thumbnail": "https://d2xdmhkmkbyw75.cloudfront.net/9_thumb.jpg","highRes": null
},"totalCarbohydrate": 0.04,"calories": 187.0,"nutrients": [
{
"attributeID": 203,"value": 20.366
},{
"attributeID": 204,"value": 11.1095
},{
"attributeID": 205,"value": 0.0425
},{
"attributeID": 207,"value": 0.7225
},{
"attributeID": 208,"value": 187.0
},{
"attributeID": 255,"value": 52.9975
},{
"attributeID": 268,"value": 782.0
},{
"attributeID": 291,"value": 0.0
},{
"attributeID": 301,"value": 11.05
},{
"attributeID": 303,"value": 1.3685
},{
"attributeID": 304,"value": 17.0
},{
"attributeID": 305,"value": 152.15
},{
"attributeID": 306,"value": 173.4
},{
"attributeID": 307,"value": 60.35
},{
"attributeID": 309,"value": 1.4535
},{
"attributeID": 312,"value": 0.0604
},{
"attributeID": 315,"value": 0.023
},{
"attributeID": 317,"value": 13.345
},{
"attributeID": 318,"value": 507.45
},{
"attributeID": 319,{
"attributeID": 320,{
"attributeID": 401,"value": 0.34
},{
"attributeID": 404,"value": 0.0485
},{
"attributeID": 405,"value": 0.1607
},{
"attributeID": 406,"value": 5.9764
},{
"attributeID": 410,"value": 0.8526
},{
"attributeID": 415,"value": 0.289
},{
"attributeID": 417,"value": 19.55
},{
"attributeID": 418,"value": 0.663
},{
"attributeID": 431,{
"attributeID": 432,{
"attributeID": 435,{
"attributeID": 501,"value": 0.2253
},{
"attributeID": 502,"value": 0.8449
},{
"attributeID": 503,"value": 1.009
},{
"attributeID": 504,"value": 1.4841
},{
"attributeID": 505,"value": 1.6363
},{
"attributeID": 506,"value": 0.5372
},{
"attributeID": 507,"value": 0.2729
},{
"attributeID": 508,"value": 0.7973
},{
"attributeID": 509,"value": 0.652
},{
"attributeID": 510,"value": 0.9911
},{
"attributeID": 511,"value": 1.2895
},{
"attributeID": 512,"value": 0.5848
},{
"attributeID": 513,"value": 1.1815
},{
"attributeID": 514,"value": 1.8224
},{
"attributeID": 515,"value": 2.9801
},{
"attributeID": 516,"value": 1.3413
},{
"attributeID": 517,"value": 1.0098
},{
"attributeID": 518,"value": 0.7327
},{
"attributeID": 601,"value": 79.9
},{
"attributeID": 606,"value": 3.111
},{
"attributeID": 610,{
"attributeID": 611,"value": 0.017
},{
"attributeID": 612,"value": 0.085
},{
"attributeID": 613,"value": 2.278
},{
"attributeID": 614,"value": 0.629
},{
"attributeID": 617,"value": 3.655
},{
"attributeID": 618,"value": 2.108
},{
"attributeID": 619,"value": 0.0935
},{
"attributeID": 620,"value": 0.102
},{
"attributeID": 621,"value": 0.0255
},{
"attributeID": 626,"value": 0.612
},{
"attributeID": 628,"value": 0.1105
},{
"attributeID": 629,"value": 0.0085
},{
"attributeID": 630,{
"attributeID": 631,{
"attributeID": 645,"value": 4.437
},{
"attributeID": 646,"value": 2.4225
}
],"saturatedFat": 3.11,"serving_weight": 85.0,"sodium": 60.35,"foodName": "chicken","dietaryFiber": 0.0,"protein": 20.37,"cholesterol": 79.9,"sugar": 0.0
}
],"meals": "chicken"
}
这是我尝试反序列化此对象的方法:
class FirebaseFood {
int id;
String mealType;
String meals;
List<FireNutritionix> fireNutritionix;
double totalCalories;
FirebaseFood(
{this.fireNutritionix,this.id,this.meals,this.mealType,this.totalCalories});
factory FirebaseFood.fromFirebase(Map<dynamic,dynamic> parsedFirebase) {
var list = parsedFirebase['nutritionixData'] as List;
List<FireNutritionix> fireNutritionix =
list.map((i) => FireNutritionix.fromFirebase(i)).toList();
return FirebaseFood(
fireNutritionix: fireNutritionix,id: parsedFirebase['id'],meals: parsedFirebase['meals'],mealType: parsedFirebase['mealType'],totalCalories: parsedFirebase['totalCalories']);
}
}
class FireNutritionix {
double calories;
double cholesterol;
double dietaryFiber;
List<FireNutrients> fireNutrients;
double phospate;
List<FirePhoto> photo;
double potassium;
double protein;
double saturatedFat;
double servingQuantity;
double serving_weight;
double sodium;
double sugar;
double totalCarbohydrate;
double totalFat;
FireNutritionix(
{this.calories,this.cholesterol,this.dietaryFiber,this.fireNutrients,this.phospate,this.photo,this.potassium,this.protein,this.saturatedFat,this.serving_weight,this.servingQuantity,this.sodium,this.sugar,this.totalCarbohydrate,this.totalFat});
factory FireNutritionix.fromFirebase(Map<dynamic,dynamic> parsedFirebase) {
var list = parsedFirebase['nutrients'] as List; // being called on null
List<FireNutrients> fireNutrients =
list.map((i) => FireNutrients.fromFirebase(i)).toList();
var list2 = parsedFirebase['photo'] as List; // being called on null
List<FirePhoto> firePhoto = list2.map((i) => FirePhoto.fromFirebase(i));
return FireNutritionix(
calories: parsedFirebase['calories'],cholesterol: parsedFirebase['cholesterol'],dietaryFiber: parsedFirebase['dietaryFiber'],fireNutrients: fireNutrients,phospate: parsedFirebase['phospate'],photo: firePhoto,potassium: parsedFirebase['potassium'],protein: parsedFirebase['protein'],saturatedFat: parsedFirebase['saturatedFat'],serving_weight: parsedFirebase['serving_weight'],servingQuantity: parsedFirebase['servingQuantity'],sodium: parsedFirebase['sodium'],sugar: parsedFirebase['sugar'],totalCarbohydrate: parsedFirebase['totalCarbohydrate'],totalFat: parsedFirebase['totalFat']);
}
}
class FireNutrients {
int attributeID;
double value;
FireNutrients({this.attributeID,this.value});
factory FireNutrients.fromFirebase(Map<dynamic,dynamic> parsedFirebase) {
return FireNutrients(
attributeID: parsedFirebase['attributeID'],value: parsedFirebase['value']);
}
}
class FirePhoto {
String highRes;
String thumbnail;
FirePhoto({this.highRes,this.thumbnail});
factory FirePhoto.fromFirebase(Map<dynamic,dynamic> parsedFirebase) {
return FirePhoto(
highRes: parsedFirebase['highRes'],thumbnail: parsedFirebase['thumbnail']);
}
}
我得到的错误是:
E/flutter ( 9185): Receiver: null
E/flutter ( 9185): Tried calling: map<FireNutrients>(Closure: (dynamic) => FireNutrients)
E/flutter ( 9185): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
E/flutter ( 9185): #1 new FireNutritionix.fromFirebase
package:thesis/fromFirebase/firebaseFood.dart:69
E/flutter ( 9185): #2 _fitnessAppHomeScreenState.checkMealsList.<anonymous closure>.<anonymous closure>
package:thesis/fitnessAppHomeScreen.dart:182
E/flutter ( 9185): #3 List.forEach (dart:core-patch/growable_array.dart:283:8)
虽然我不明白为什么要对null调用parsedFirebase ['Nutritions']。.任何帮助和解释将不胜感激!非常感谢!