flutter - 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"
}
]
}
]
解决方案
由于这个答案,我找到了解决方案:https ://stackoverflow.com/a/61583933/345812
我需要做的就是:
List<Ingredient> ingredients = List<Ingredient>.from(
recipeIngredients.map((x) => Ingredient.fromJson(x)));
这将返回正确的列表
推荐阅读
- spring - 面临@PathParam 注解的问题
- python - python程序不起作用
- python - 需要在 Python 中提示输入
- java - 算法:并行启动两个服务,但顺序运行它们
- javascript - Dynamics 365. 字段值 (javascript)
- javascript - 当突出显示的行是表格主体中可见的最后一行时滚动表格
- google-bigquery - 联合表/查询不起作用 - “无法在位置读取:us-west1”
- python - 如何将dataFrame中的数据加载到mssql表中
- javascript - 遍历列表并进行顺序网络调用
- excel - 如果满足条件,则将公式转换为值