【问题标题】:Extracting an object from JSON in a 'parent' object's .fromJson method在“父”对象的 .fromJson 方法中从 JSON 中提取对象
【发布时间】:2020-06-22 08:29:00
【问题描述】:

我想将 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 方法,这是正确的吗?
  • 这意味着我必须在一行中提取整个对象 代码,我该怎么做?

【问题讨论】:

    标签: json object flutter dart


    【解决方案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),
        });
      }
    }
    

    【讨论】:

    • 感谢 Aligator,这是一个有用的答案。最后我: 1. 将十六进制颜色值分别保存到 JSON,2. 使用 Color(int.parse(json['highlight'], radix 16)); 提取它们十六进制转换为我解决了这个问题,我欠你的。干杯山姆。
    猜你喜欢
    • 2015-01-17
    • 2017-08-12
    • 2017-07-21
    • 2021-03-16
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多