遍历json对象并获取特定数据

时间:2020-10-30 11:38:06

标签: arrays json flutter dart

我有一个来自API的json

    "nutrient_value": [
      {
        "Calcium": [
          "29.16",
          "mg",
          "Red",
          "0.00102858984",
          "ounce"
        ]
      },
      {
        "Choline": [
          "118.97",
          "mg",
          "Red",
          "0.00419654778",
          "ounce"
        ]
      },
      {
        "Copper": [
          "0.12",
          "mg",
          "Red",
          "0.00000423288",
          "ounce"
        ]
      },
      {
        "Crude fat": [
          "29.16",
          "g",
          "Green",
          "1.02858984",
          "ounce"
        ]
      },
      {
        "Folate": [
          "11.66",
          "mcg",
          "Red",
          "0.00000041129484",
          "ounce"
        ]
      },
      {
        "Iodine": [
          "0.0",
          "mcg",
          "Red",
          "0.0",
          "ounce"
        ]
      },
      {
        "Iron": [
          "4.08",
          "mg",
          "Yellow",
          "0.00014391792",
          "ounce"
        ]
      },
      {
        "Magnesium": [
          "34.99",
          "mg",
          "Green",
          "0.00123423726",
          "ounce"
        ]
      },
      {
        "Manganese": [
          "0.02",
          "mg",
          "Red",
          "0.00000070548",
          "ounce"
        ]
      },
      {
        "Niacin (B3)": [
          "9.04",
          "mg",
          "Green",
          "0.00031887696",
          "ounce"
        ]
      },
      {
        "Omega-3 excl. ALA and SDA": [
          "0.02",
          "g",
          "Red",
          "0.00070548",
          "ounce"
        ]
      },
      {
        "Omega-6": [
          "0.02",
          "g",
          "Red",
          "0.00070548",
          "ounce"
        ]
      },
      {
        "Pantothenic acid (B5)": [
          "1.07",
          "mg",
          "Red",
          "0.00003774318",
          "ounce"
        ]
      },
      {
        "Phosphorus": [
          "332.42",
          "mg",
          "Red",
          "0.01172578308",
          "ounce"
        ]
      },
      {
        "Potassium": [
          "573.48",
          "mg",
          "Yellow",
          "0.02022893352",
          "ounce"
        ]
      },
      {
        "Protein": [
          "36.94",
          "g",
          "Green",
          "1.30302156",
          "ounce"
        ]
      },
      {
        "Riboflavin (B2)": [
          "0.29",
          "mg",
          "Red",
          "0.00001022946",
          "ounce"
        ]
      },
      {
        "Selenium": [
          "30.72",
          "mcg",
          "Red",
          "0.00000108361728",
          "ounce"
        ]
      },
      {
        "Sodium (Na)": [
          "128.3",
          "mg",
          "Green",
          "0.0045256542",
          "ounce"
        ]
      },
      {
        "Thiamin (B1)": [
          "0.08",
          "mg",
          "Red",
          "0.00000282192",
          "ounce"
        ]
      },
      {
        "Vitamin A": [
          "8.16",
          "mcg",
          "Red",
          "0.00000028783584",
          "ounce"
        ]
      },
      {
        "Vitamin C": [
          "0.0",
          "mg",
          "Green",
          "0.0",
          "ounce"
        ]
      },
      {
        "Vitamin D": [
          "0.19",
          "mcg",
          "Red",
          "0.00000000670206",
          "ounce"
        ]
      },
      {
        "Vitamin E": [
          "0.33",
          "mg",
          "Red",
          "0.00001164042",
          "ounce"
        ]
      },
      {
        "Zinc (Zn)": [
          "8.71",
          "mg",
          "Red",
          "0.00030723654",
          "ounce"
        ]
      },
      {
        "Calories": [
          "417.96",
          "cal",
          null,
          "N/A",
          "ounce"
        ]
      },
      {
        "Omega-3/6 ratio": [
          "0.65",
          "ratio",
          "Green",
          "N/A",
          "ounce"
        ]
      },
      {
        "Calcium/Phosphorus ratio": [
          "0.06",
          "ratio",
          "Red",
          "N/A",
          "ounce"
        ]
      }
    ],

从上述json即时消息中将其解码为此

var resJson = json.decode(res);
MPD.Result _mealPlan = MPD.Result.fromJson(resJson["result"]);
///

factory Result.fromJson(Map<String, dynamic> json) => Result(
    id: json["id"],
....
    nutrientValue: List<NutrientValue>.from(json["nutrient_value"].map((x) => NutrientValue.fromJson(x))),
....
  );
"nutrient_value": []

在营养值数组中,对于每个项目,我需要检查给定键(例如:“钙”)是否存在,如果存在,则获取该键的索引[0]和[2]的值:

Example key "Calcium" exists and 
valueCalcium = value of index[0]
colorCalcium = value of index[2]

"nutrient_value": [
      {
        "Calcium": [
          "29.16",
          "mg",
          "Red",
          "0.00102858984",
          "ounce"
}

我该怎么做呢?

我已经尝试过了

_mealPlan.nutrientValue.forEach((element) {
        if(element.calcium.isNotEmpty){
          valCalcium = element.calcium[0];
          print(valCalcium);//_mealPlan.nutrientValue[0].calcium[0];
          calciumClr = element.calcium[2];
          print(calciumClr);
        }
      });

但这似乎不是正确的方法。

我在代码的后面部分中使用了这两个索引值中的每一个。

1 个答案:

答案 0 :(得分:0)

您可以这样做:

void main() {
  Map<String, dynamic> data = {
    "success": true,
    "result": {
      "id": 7,
      "daily_allowance_actual_percentage": {
        "Bone": [0, "Red"],
        "Muscle Meat": [100, "Red"]
      },
      "daily_calories_from_this_meal_plan": "417.96",
      "imperial_weight_of_one_meal": "2.2857552",
      "meal_ingredients_would_make": 3,
      "meals_per_day": 3,
      "nutrient_value": [
        {
          "Calcium": ["29.16", "mg", "Red", "0.00102858984", "ounce"]
        },
        {
          "Choline": ["118.97", "mg", "Red", "0.00419654778", "ounce"]
        },
        {
          "Copper": ["0.12", "mg", "Red", "0.00000423288", "ounce"]
        },
        {
          "Crude fat": ["29.16", "g", "Green", "1.02858984", "ounce"]
        },
        {
          "Folate": ["11.66", "mcg", "Red", "0.00000041129484", "ounce"]
        },
        {
          "Iodine": ["0.0", "mcg", "Red", "0.0", "ounce"]
        },
        {
          "Iron": ["4.08", "mg", "Yellow", "0.00014391792", "ounce"]
        },
        {
          "Magnesium": ["34.99", "mg", "Green", "0.00123423726", "ounce"]
        },
        {
          "Manganese": ["0.02", "mg", "Red", "0.00000070548", "ounce"]
        },
        {
          "Niacin (B3)": ["9.04", "mg", "Green", "0.00031887696", "ounce"]
        },
        {
          "Omega-3 excl. ALA and SDA": [
            "0.02",
            "g",
            "Red",
            "0.00070548",
            "ounce"
          ]
        },
        {
          "Omega-6": ["0.02", "g", "Red", "0.00070548", "ounce"]
        },
        {
          "Pantothenic acid (B5)": [
            "1.07",
            "mg",
            "Red",
            "0.00003774318",
            "ounce"
          ]
        },
        {
          "Phosphorus": ["332.42", "mg", "Red", "0.01172578308", "ounce"]
        },
        {
          "Potassium": ["573.48", "mg", "Yellow", "0.02022893352", "ounce"]
        },
        {
          "Protein": ["36.94", "g", "Green", "1.30302156", "ounce"]
        },
        {
          "Riboflavin (B2)": ["0.29", "mg", "Red", "0.00001022946", "ounce"]
        },
        {
          "Selenium": ["30.72", "mcg", "Red", "0.00000108361728", "ounce"]
        },
        {
          "Sodium (Na)": ["128.3", "mg", "Green", "0.0045256542", "ounce"]
        },
        {
          "Thiamin (B1)": ["0.08", "mg", "Red", "0.00000282192", "ounce"]
        },
        {
          "Vitamin A": ["8.16", "mcg", "Red", "0.00000028783584", "ounce"]
        },
        {
          "Vitamin C": ["0.0", "mg", "Green", "0.0", "ounce"]
        },
        {
          "Vitamin D": ["0.19", "mcg", "Red", "0.00000000670206", "ounce"]
        },
        {
          "Vitamin E": ["0.33", "mg", "Red", "0.00001164042", "ounce"]
        },
        {
          "Zinc (Zn)": ["8.71", "mg", "Red", "0.00030723654", "ounce"]
        },
        {
          "Calories": ["417.96", "cal", null, "N/A", "ounce"]
        },
        {
          "Omega-3/6 ratio": ["0.65", "ratio", "Green", "N/A", "ounce"]
        },
        {
          "Calcium/Phosphorus ratio": ["0.06", "ratio", "Red", "N/A", "ounce"]
        }
      ],
      "pet_name": "tim",
      "show_weight_of_balanced_meal": true,
      "suggestion": {
        "add_food": {
          "Red": [
            {
              "Calcium": ["Amaranth, grain, whole, uncooked", "Apple, dried"]
            },
            {
              "Copper": ["Amaranth, grain, whole, uncooked", "Apple, dried"]
            },
            {
              "Folate": [
                "Amaranth, grain, whole, uncooked",
                "Apple, fuji, unpeeled, raw"
              ]
            },
            {
              "Iodine": ["Amaranth, grain, whole, uncooked", "Apricot, dried"]
            },
            {
              "Manganese": ["Amaranth, grain, whole, uncooked", "Apple, dried"]
            },
            {
              "Omega-3 excl. ALA and SDA": ["Bass, fillet, raw", "Beef Brain"]
            },
            {
              "Omega-6": ["Amaranth, grain, whole, uncooked", "Avocado, raw"]
            },
            {
              "Pantothenic acid (B5)": [
                "Amaranth, grain, whole, uncooked",
                "Apple, dried"
              ]
            },
            {
              "Riboflavin (B2)": [
                "Amaranth, grain, whole, uncooked",
                "Apple, fuji, unpeeled, raw"
              ]
            },
            {
              "Thiamin (B1)": [
                "Amaranth, grain, whole, uncooked",
                "Apple, fuji, unpeeled, raw"
              ]
            },
            {
              "Vitamin A": ["Bean, edamame, from frozen, cooked", "Beef Brain"]
            },
            {
              "Vitamin D": ["Beef kidney, raw", "Beef liver, raw"]
            },
            {
              "Vitamin E": ["Amaranth, grain, whole, uncooked", "Apple, dried"]
            },
            {
              "Crude fat": ["Amaranth, grain, whole, uncooked", "Apple, dried"]
            },
            {
              "Magnesium": ["Amaranth, grain, whole, uncooked", "Apple, dried"]
            },
            {
              "Niacin (B3)": [
                "Apple, fuji, unpeeled, raw",
                "Apple, golden delicious, unpeeled, raw"
              ]
            },
            {
              "Protein": ["Amaranth, grain, whole, uncooked", "Apple, dried"]
            },
            {
              "Sodium (Na)": [
                "Amaranth, grain, whole, uncooked",
                "Apple, dried"
              ]
            }
          ],
          "Yellow": []
        },
        "remove_food": {
          "Red": [
            {
              "Choline": ["Beef, mince, 15% fat, raw"]
            },
            {
              "Phosphorus": ["Beef, mince, 15% fat, raw"]
            },
            {
              "Selenium": ["Beef, mince, 15% fat, raw"]
            },
            {
              "Zinc (Zn)": ["Beef, mince, 15% fat, raw"]
            }
          ],
          "Yellow": [
            {
              "Iron": ["Beef, mince, 15% fat, raw"]
            },
            {
              "Potassium": ["Beef, mince, 15% fat, raw"]
            }
          ]
        }
      },
      "total_calories_in_a_meal_plan": 645,
      "total_imperial_weight_of_a_meal_plan": 10.5822,
      "total_weight_of_a_meal_plan": 300,
      "weight_of_one_meal": "64.8",
      "feeding_plan_details": [
        {
          "id": 23,
          "imperial_quantity": 10.5822,
          "quantity": 300,
          "food": {
            "id": 6,
            "bone_percentage": 0,
            "name": "Beef, mince, 15% fat, raw"
          }
        }
      ]
    }
  };

  List<Map<String, dynamic>> nutrientValue = data["result"]["nutrient_value"];

  List<Map<String, dynamic>> filteredData = nutrientValue
      .where((Map<String, dynamic> element) =>
          element.keys.toList()[0] == "Calcium")
      .toList();

  for (Map<String, dynamic> i in filteredData) {
    print("${i[i.keys.toList()[0]][0]} && ${i[i.keys.toList()[0]][2]}");
  }
}