首页 > 解决方案 > Dart - 将 json 转换为类型列表

问题描述

我正在开发一个食谱应用程序,我有一个端点可以返回所有数据和一个包含所有所需成分的数组。
在我的提供程序中,我使用Recipes.fromJson 获取所有食谱并且一切正常,但是当需要获取成分数组时我遇到了一些问题。

这是成分 json(作为包含所有食谱信息的更大 json 的一部分):

[{quantity: 1, unit: , ingredient: rortolo di pasta sfoglia rettangolare, notes: }, {quantity: 2, unit: , ingredient: patate, notes: ( o 1 o 3 dipende dalla grandezza delle patate)}, {quantity: qb, unit: , ingredient: pesto fresco, notes: potete farlo o comprarlo l'importante è che sia quello fresco}, {quantity: qb, unit: , ingredient: formaggio a scelta, notes: io ho usato emmental, evitate di scegliere formggi troppo molli farebbero solo poltiglia}, {quantity: 1, unit: , ingredient: tuorlo d'uovo, notes: }]

成分:

import 'package:meta/meta.dart';

class Ingredient {
  final String quantity;
  final String unit;
  final String ingredient;
  final String note;

  Ingredient({
    @required this.quantity,
    @required this.ingredient,
    this.unit,
    this.note,
  });

  factory Ingredient.fromJson(Map<String, dynamic> json) {
    return Ingredient(
      ingredient: json['ingredient'] ?? '',
      quantity: json['quantity'] ?? '',
      unit: json['unit'] ?? '',
      note: json['note'] ?? null,
    );
  }
}

这就是Recipe.fromJson,在食谱模型中,我尝试获取成分并构建一个列表,但没有成功。

import 'dart:convert';

import 'package:meta/meta.dart';

import '../models/ingredient.dart';

class Recipe {
  final int id;
  final String title;
  final String intro;
  final String difficulty;
  final String cookingTime;
  final String featureImage;
  final String description;
  final String servings;
  final List<Ingredient> ingredients;

  Recipe({
    @required this.id,
    @required this.title,
    @required this.difficulty,
    @required this.cookingTime,
    @required this.featureImage,
    @required this.description,
    @required this.ingredients,
    @required this.servings,
    this.intro,
  });

  factory Recipe.fromJson(Map<String, dynamic> json) {
    var recipeIngredients = json['ingredients'];
    List<Ingredient> ingredients = recipeIngredients.map((i) {
      print(i);
      return Ingredient.fromJson(i);
    }).toList();

    return Recipe(
      id: json['id'] ?? null,
      title: json['title'] ?? '',
      difficulty: json['difficulty'] ?? 'facile',
      cookingTime: json['cooking_time'] ?? '',
      servings: json['servings'] ?? '',
      featureImage:
          json['featureImage'] ?? 'https://via.placeholder.com/1920x768',
      description: json['description'] ?? '',
      intro: json['intro'] ?? '',
      ingredients: ingredients,
    );
  }
}

注意:如果我打印recipeIngredients,我会得到上面发布的 json。

如果我运行代码,我会收到此错误:

颤振:类型“列表”不是“列表”类型的子类型

知道为什么吗?

编辑:
这是我从 API 得到的:

[
   {
      "id":348,
      "title":"Spiedini di mazzancolle cocco e lime",
      "intro":"Oggi voglio proporvi una ricetta semplicissima da fare e da inserire in un buffet di antipasti. E' molto molto gustosa, dal sapore tropicale e conquister\u00e0 tutti i palati per la sua particolarit\u00e0 e il perfetto connubio tra gli ingredienti presenti nella ricetta.\r\n\r\nDai andiamo in cucina insieme vedrete che non resterete delusi",
      "featureImage":"https:\/\/example.it\/wp-content\/uploads\/2020\/12\/coccolime.jpeg",
      "difficulty":"Easy",
      "cooking_time":"30",
      "servings":"4",
      "ingredients":[
         {
            "quantity":"400",
            "unit":"g",
            "ingredient":"mazzancolle",
            "notes":"o se preferite gamberi"
         },
         {
            "quantity":"4 cucchiai",
            "unit":"",
            "ingredient":"farina di cocco",
            "notes":"(non cocco rap\u00e8 farina di cocco)"
         },
         {
            "quantity":"2 cucchiai ",
            "unit":"",
            "ingredient":"pangrattato",
            "notes":""
         },
         {
            "quantity":"1",
            "unit":"",
            "ingredient":"lime",
            "notes":""
         },
         {
            "quantity":"qb",
            "unit":"",
            "ingredient":"pepe rosa in grani da macinare al momento",
            "notes":""
         },
         {
            "quantity":"",
            "unit":"",
            "ingredient":"",
            "notes":""
         }
      ],
      "instructions":[
         {
            "image":"",
            "description":"La realizzazione di questa ricetta \u00e8 davvero molto semplice. Come prima cosa preriscaldate il forno a 180 gradi , preparate in un piatto il mix di farina di cocco, pepe rosa macinato al momento ( io uso un pepe rosa con macinino nel tappo che contiene pepe rosa e limone e d\u00e0 un tocco davvero molto speciale) e pan grattato, preparate anche un altro piatto con dentro il succo di un lime e pulite i gamberi togliendo il carapace "
         },
         {
            "image":"",
            "description":"Immergete adesso le mazzancolle nel piatto con il mix di farina di cocco,pan grattato e pepe rosa e girateli per bene in modo da infarinare tutte le mazzancolle"
         },
         {
            "image":"",
            "description":"Adesso immergeteli nel piatto col succo di lime e girateli velocemente per far prendere il succo a tutte le mazzancolle"
         },
         {
            "image":"",
            "description":"A questo punto rimetteteli nel piatto col mix di farina di cocco,pepe rosa e pan grattato e girateli di nuovo per far prendere la farina a tutte le mazzancolle"
         },
         {
            "image":"",
            "description":"Mettetele in un piatto e fateli riposare 5 minuti"
         },
         {
            "image":"",
            "description":"Adesso prendete gli spiedini e mettete 3 mazzancolle su ogni spiedino"
         },
         {
            "image":"",
            "description":"Prendete la teglia da forno coperta con carta da forno, disponete sopra gli spiedini e infornate a 180 gradi per 15 minuti"
         },
         {
            "image":"349",
            "description":"Sfornate, mettete su un piatto da portata e servite"
         }
      ]
   }
]

标签: flutterdart

解决方案


由于这个答案,我找到了解决方案:https ://stackoverflow.com/a/61583933/345812

我需要做的就是:

List<Ingredient> ingredients = List<Ingredient>.from(
        recipeIngredients.map((x) => Ingredient.fromJson(x)));

这将返回正确的列表


推荐阅读