当前位置: 首页 > 知识库问答 >
问题:

jsonEncode不支持枚举扩展;有没有变通办法?

屈翰飞
2023-03-14

在Dart(2.15.0)中,我试图通过定义toJson方法将jsonEncode与枚举一起使用。它不起作用。

import 'dart:convert';

enum Day { monday, tuesday }

extension ParseToJsonString on Day {
  String toJson() {
    return this.toString().split('.').last;
  }
}

class Saturday {
  String toJson() => "WOOHOO Saturday";
}

main() {
  //works!
  Saturday s=Saturday();
  print(s.toJson());
  print(jsonEncode(s));
  
  Day m = Day.monday;
  print(m.toJson()); //prints 'monday'
  print(m); //prints Day.monday
  print(jsonEncode(m)); // Uncaught Error: Converting object to an encodable object failed: Instance of 'Day'
}

根据文档,jsonEncode将查找toJson()方法。

当直接在枚举上调用时,扩展可以工作,但是不知何故jsonEncode没有找到toJSON。

Dart如何获取枚举的“值”https://dart.dev/guides/language/extension-methods

知道这是一个错误还是预期的行为吗?

否则,我可以使用枚举并以某种方式定义一些与jsonEncode一起使用的东西吗?

谢谢!

共有1个答案

施彬郁
2023-03-14

我做了一些调查,由于jsonEncode的工作方式,这是正确的行为。

看见https://github.com/dart-lang/sdk/issues/42742

请注意,即使使用 jsonEncode 的可选参数也无法修复它:

  print(jsonEncode(m, toEncodable: (x)=>x!.toJson()) ); // won't work.

为了克服“扩展不适用于动态类型”的问题,我们还必须使用重铸:

  print(jsonEncode(
    m,
    toEncodable: (x) {
      Day recastX = x as Day;
      return recastX.toJson();
    },
  )); // works, prints 'monday'

在Dartpad上看到它

 类似资料:
  • 问题内容: 我有一个枚举,我们称它为A: 我有一个需要枚举A的函数: 如何创建另一个枚举,可能调用B并传递给 functionA ?像这样吗 我知道您无法扩展枚举,但是我还有哪些其他选择?实现此目标的最佳方法是什么? 问题答案: 你不能 枚举类型在设计上是最终的。 原因是每个枚举类型都应 仅 具有 在枚举中声明的元素 (例如,我们可以在switch语句中使用它们),如果允许扩展类型,则不可能。 您

  • 所以我正在做一个需要xml模式的小项目,我对这个模式很不熟悉。 我希望能够设置模式以在两组属性之间进行选择,根据我的研究,这在XSD 1.0中是不可能的,但显然是XSD 1.1的一个特性。 目前我正在使用VisualStudio来完成我的工作,它似乎被困在XSD1.0模式中,这是有意义的,因为XSD1.1显然是一个最新的开发。 我的问题是,是否有一个插件/扩展可以让我在Visual Studio中

  • 问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚

  • Electron 支持 Chrome 扩展API的子集, 主要是支持 DevTools 扩展和 Chromium-internal 扩展,但它同时也支持一些其他扩展能。 注意:Electron 不支持商店中的任意 Chrome 扩展,Electron 项目的目标不是与 Chrome 的扩展实现完全兼容。 加载扩展 Electron 只支持加载未打包的扩展 (即不能使用 .crx 文件)。 插件会被

  • 问题内容: 假设我有以下情况: 有没有一种方法可以保证实现的任何类也必须扩展?我不想创建一个抽象类,因为我希望能够以类似的方式混合其他一些接口。 例如: 问题答案: Java接口无法扩展类,这很有意义,因为类包含无法在接口内指定的实现细节。 解决此问题的正确方法是通过将接口也完全从实现中分离出来。所述等可以扩展接口以迫使程序员来实现相应的方法。如果要在所有实例之间共享代码,则可以将(可能是抽象的)

  • 我有一个非常简单的练习,我注册客户端名称(字符串),我使用数组来做到这一点,所以当我添加一个新的我将使用另一个辅助数组,然后增加原来的长度,或者我将使用System.array复制,有没有其他方法,逐渐增加数组长度,因为你需要添加元素到该数组,不涉及辅助数组?