将字段映射到 fromjson dart

Map field into fromjson dart

这可能是一个愚蠢的问题,但我无法理解 fromJson 和 toJson 的工作原理。

在这种情况下,如果我使用列表,我会这样做:

class DataPerDaysInfo{
  List<Product>? products;

  DataPerDaysInfo({required this.products});

  factory DataPerDaysInfo.fromJson(Map<String, dynamic> json) => DataPerDaysInfo(
      products : json["products"] == null ? null: List<Product>.from(json["products"].map((x) => Product.fromJson(x))));

  Map<String, dynamic> toJson() =>
      {
        "products": products == null
            ? null
            : List<dynamic>.from(products!.map((x) => x.toJson())),
      };
  }

但是如果我需要使用地图,我该怎么做呢?

class DataPerDaysInfo{
  Map<String, List<Product>> mapper;

  DataPerDaysInfo({required this.mapper});
  
}

没有给定 json 字符串。很难猜。但也许这个实现对你有一点帮助:

import 'dart:convert';

void main() {
  var dpdi = DataPerDaysInfo.fromJson(jsonDecode(json));
  print(dpdi.toJson());
}

final String json = '''
{
    "catalog1": [
        {"id": 1, "name": "first"},
        {"id": 2, "name": "second"}
    ],
    "catalog2": [
        {"id": 1, "name": "first"},
        {"id": 2, "name": "second"}
    ]
  }
''';

class DataPerDaysInfo {
  Map<String, List<Product>> mapper = {};

  DataPerDaysInfo.fromJson(Map<String, dynamic> json) {
    json.forEach((key, value) => mapper[key] = value
        .map((val) => Product.fromJson(val))
        .cast<Product>()
        .toList(growable: false));
  }

  String toJson() {
    return jsonEncode(mapper);
  }
}

class Product {
  final int id;
  final String name;

  Product.fromJson(Map<String, dynamic> json)
      : id = json['id'],
        name = json['name'];

  @override
  String toString() {
    return 'id: $id, name: $name';
  }

  Map<String, dynamic> toJson() {
    return {'id': id, 'name': name};
  }
}