从“父”对象的.fromJson方法中的JSON中提取对象

时间:2020-03-10 12:26:55

标签: json object flutter dart

我想将ColorSwatch存储在json中,并将其提取到对象的.fromJson方法中。

我尝试过将其存储在JSON中,

"colorSwatch": "ColorSwatch(0xFFFFB7DE, { 'highlight': Color(0xFFFFB7DE), 'splash': Color(0xFFF94CBF) })"

然后将其提取:

colorSwatch = jsonMap ['colorSwatch'],

它没有用。我尝试将JSON更改为:

"colorSwatch": "0xFFFFB7DE, { 'highlight': Color(0xFFFFB7DE), 'splash': Color(0xFFF94CBF) }"

然后将对象的.fromJson方法修改为:

colorSwatch = ColorSwatch(jsonMap['colorSwatch']),

它没有用。然后,我尝试了:

colorSwatch = jsonMap['colorSwatch'] as ColorSwatch,

没有用。

然后我尝试将突出显示颜色和初始颜色分别保存在json中,并使用

进行提取
highlight = jsonMap['highlight'] as int,
splash = jsonMap['splash'] as int,
colorSwatch = new ColorSwatch(0xFFFFD28E, {'highlight': Color(highlight), 'splash': Color(splash)}),

但是显然,我只能在对象的fromJson方法中对静态变量进行操作。

所以我被困住了。

我希望将ColorSwatch对象附加到Riddle对象,因此与Riddle相关的所有属性都放在一个位置,不需要在需要时在其他位置组装。

  • 似乎无法在内部构建对象(此处为ColorSwatch) 另一个对象.fromJson方法,对吗?
  • 所以这意味着我必须在一行中提取整个对象 代码,我该怎么做?

1 个答案:

答案 0 :(得分:1)

Json不支持十六进制,因此您需要将它们写为字符串并使用int.tryparse进行转换:

  var hexadecimalString = 'ff542144';
  var decimalInteger = int.tryParse(hexadecimalString, radix: 16);

对于您的ColorSwatch,您需要这样的帮助程序类:

class ColorSwatch {
  final Color swatch;
  final Color splash;
  final Color highlight;

  ColorSwatch(this.swatch, this.splash, this.highlight);

  factory ColorSwatch.fromJson(Map<String, dynamic> json) {
    return ColorSwatch(
      Color(int.tryParse(json['colorSwatch'], radix: 16)),
      Color(int.tryParse(json['highlight'], radix: 16)),
      Color(int.tryParse(json['splash'], radix: 16)),
    );
  }

  String toJson() {
    return jsonEncode({
      'colorSwatch': swatch.value.toRadixString(16),
      'highlight': highlight.value.toRadixString(16),
      'splash': splash.value.toRadixString(16),
    });
  }
}