json - 如何在 dart 中创建 json('_CompactLinkedHashSet 的异常实例)
问题描述
我正在尝试将一些对象转换为 json 以将其发送到 DB,这是我现在拥有的代码:
Map<String, dynamic> bag = {};
bag = {
'colors' : [
for(int i = 0; i < product.colors.length; i ++){
'id': product.colors[i].id,
'desc': product.colors[i].desc,
'sizes': [
for(int j=0; j < product.colors[i].sizes.length; j ++){
product.colors[i].sizes[j].toJson()
}
]
}]
};
print(json.encode(bag));
但我得到的结果是这样的:
将对象转换为可编码对象失败:“_CompactLinkedHashSet<Map<String, dynamic>>”的实例
我该如何解决?
产品类别:
final String id;
final String desc;
final List<Colors> colors;
颜色:
final String id;
final String desc;
final List<Prices> prices;
价格:
final String id;
final String desc;
final List<Types> types;
类型:
final String id;
final String desc;
final List<Sizes> sizes;
尺寸:
final String id;
final int stock;
final String desc;
final bool filled;
int quantity;
final double price;
我想要这样的json:
colors:
id : 12
desc : black
sizes: [
id : 0202202
stock : 10
desc: Full Size
filled: true
quantity : 2
price : 200
]
解决方案
您创建 JSON 的方式太复杂了。尝试toJson()
在每个类上添加一个方法。如果 Dart JSON 编码器遇到与 JSON 不兼容的对象,则会自动调用此方法。
这是一个例子:
import 'dart:convert';
class Product {
final String id;
final String desc;
final List<Colors> colors;
Product({
required this.id,
required this.desc,
required this.colors,
});
Map<String, Object> toJson() => {
'id': id,
'desc': desc,
'colors': colors,
};
}
class Colors {
final int id;
final String desc;
final List<Prices> prices;
Colors({
required this.id,
required this.desc,
required this.prices,
});
Map<String, Object> toJson() => {
'id': id,
'desc': desc,
'prices': prices,
};
}
class Prices {
final String id;
final String desc;
final List<Types> types;
Prices({
required this.id,
required this.desc,
required this.types,
});
Map<String, Object> toJson() => {
'id': id,
'desc': desc,
'types': types,
};
}
class Types {
final String id;
final String desc;
final List<Sizes> sizes;
Types({
required this.id,
required this.desc,
required this.sizes,
});
Map<String, Object> toJson() => {
'id': id,
'desc': desc,
'sizes': sizes,
};
}
class Sizes {
final String id;
final int stock;
final String desc;
final bool filled;
int quantity;
final double price;
Sizes({
required this.id,
required this.stock,
required this.desc,
required this.filled,
required this.quantity,
required this.price,
});
Map<String, Object> toJson() => {
'id': id,
'stock': stock,
'desc': desc,
'filled': filled,
'quantity': quantity,
'price': price,
};
}
void main() {
final product = Product(id: '1', desc: 'Some text', colors: [
Colors(id: 1, desc: '', prices: [
Prices(id: '1', desc: '', types: [
Types(id: '1', desc: '', sizes: [
Sizes(
id: '1',
stock: 5,
desc: '',
filled: true,
quantity: 2,
price: 1.0)
])
])
]),
Colors(id: 2, desc: '', prices: [
Prices(id: '1', desc: '', types: [
Types(id: '1', desc: '', sizes: [
Sizes(
id: '5',
stock: 5,
desc: '',
filled: true,
quantity: 2,
price: 1.0),
Sizes(
id: '50',
stock: 5,
desc: '',
filled: true,
quantity: 2,
price: 1.0),
])
])
])
]);
final bag = {
'colors': [
for (final colors in product.colors)
{
'id': colors.id,
'desc': colors.desc,
'sizes': [
for (final prices in colors.prices)
for (final types in prices.types) ...types.sizes
]
}
]
};
print(const JsonEncoder.withIndent(' ').convert(bag));
}
输出:
{
"colors": [
{
"id": 1,
"desc": "",
"sizes": [
{
"id": "1",
"stock": 5,
"desc": "",
"filled": true,
"quantity": 2,
"price": 1.0
}
]
},
{
"id": 2,
"desc": "",
"sizes": [
{
"id": "5",
"stock": 5,
"desc": "",
"filled": true,
"quantity": 2,
"price": 1.0
},
{
"id": "50",
"stock": 5,
"desc": "",
"filled": true,
"quantity": 2,
"price": 1.0
}
]
}
]
}
这里的一个技巧是 Dart 将调用另一个toJson()
调用返回的结构中的对象。因此,例如Product.toJson
返回Map<String, Object>
包含颜色列表的 a 。Dart 然后调用toJson()
这些颜色中的每一种,依此类推。
推荐阅读
- python - 大型稀疏线性系统求解,重排序和预处理器更糟?
- c# - C# LINQ to entity 计算嵌套表中的项目
- nginx - 我可以匹配 nginx 中的 www 文件夹结构吗?
- pycharm - 如何同步 pycharm venv 解释器的 requirements.txt?
- haskell - IORef 的内存占用和性能
- ruby-on-rails - 活动存储(存储在 AWS S3 中)移动上传的图像在 safari 上旋转
- mysql - 如果连接断开,如何在 nodejs 的 promise-mysql 中使用 Pool 重新连接?
- r - 如何为 R 中的 nnet 分类/预测准备变量?
- c++ - Visual Studio 2019 CVT1101 & LNK1123 致命错误
- twitter - Drupal 8 Twitter 不会出现匿名,只有管理员