【发布时间】:2017-03-14 13:08:21
【问题描述】:
我有以下 Scala 枚举:
object RunMode extends Enumeration {
val CLIENT_MODE = Value("CLIENT")
val SERVER_MODE = Value("SERVER")
}
我有一些 JSON 作为我的应用程序的输入,例如:
{
"version" : "0.1",
"runMode" : "CLIENT"
}
这里的 JSON 字段“runMode”实际上是我的RunMode 枚举,它的值将始终是“CLIENT”或“SERVER”。我正在尝试使用 GSON 将此 JSON 反序列化为 AppConfig 实例:
class AppConfig(version : String, runMode : RunMode) {
def version() : String = { this.version }
def runMode() : RunMode.Value = { this.runMode }
}
我有以下 GSON 代码:
val gson = new Gson()
val text = Source.fromFile(jsonConfigFile).mkString
gson.fromJson(text, classOf[AppConfig])
运行时:
java.lang.RuntimeException: Unable to invoke no-args constructor for class scala.Enumeration$Value. Register an InstanceCreator with Gson for this type may fix this problem.
> Buildiat com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:226)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.Gson.fromJson(Gson.java:887)
<rest of stacktrace omitted for brevity>
很明显,GSON 期望 RunMode 有一个无参数构造函数,而它没有,因此它无法在运行时反序列化我的 JSON 文件。
我已经尝试了一百万种不同的组合,但似乎无法找到神奇的构造函数定义。所以我问:如何向RunMode 添加无参数构造函数,以便 GSON 可以将其反序列化为 AppConfig 实例?
【问题讨论】:
-
您需要 Gson 有什么特别的原因吗?如果没有,有很多 Scala 库可以开箱即用并支持枚举。
-
感谢@YuvalItzchakov (+1) 如果你能提供一个具体的代码示例,我当然会考虑!
-
我也认为(如果我错了,请随时纠正我!)这个问题的核心不是 GSON,它是事实上,我的
RunMode枚举需要一个无 arg ctor。我曾经使用过的每一个序列化框架(Jackson、XStream、GSON 等)都对模型类有相同的要求。因此,尽管我想我会接受任何有效的非 GSON 解决方案,但我真的很想让 no arg ctor 与 Scala 枚举一起使用,因为该问题可能会在代码的其他区域再次出现