未在列表[枚举]上调用 Scala gson 类型适配器



在Scala中,我有:

object CameraIds extends Enumeration {
type CameraIds = Value
val LB, LF, FC, RF, RB, L, F, R, B = Value
def fromString(s: String): Option[Value] = values.find(
_.toString.toLowerCase() == s.toLowerCase())
}
case class Filter(validCameraIds: List[CameraIds])

然后我有一个类型适配器,用于将 Json 转换为过滤器。

def getListOfCameraIdsTypeAdapter: TypeAdapter[List[CameraIds]] = {
new TypeAdapter[List[CameraIds]] {
override def write(out: JsonWriter, value: List[CameraIds]):
Unit = {
val gson: Gson = new Gson()
val array: JsonWriter = out.beginArray()
value.foreach(camId => array.value(camId.toString))
out.endArray()
}
override def read(in: JsonReader): List[CameraIds] = {
val cameraIds: mutable.Builder[Option[CameraIds], 
List[Option[CameraIds]]] = List.newBuilder[Option[CameraIds]]
in.beginArray()
while (in.hasNext) {
val nextCamId = in.nextString()
cameraIds += CameraIds.fromString(nextCamId)
}
in.endArray()
cameraIdsRet.map(_.get)
}
}
}

然后我使用 Gson 反序列化以下内容:

{
"cameraIds": ["FC", "LB", "RF"]
}

使用以下方法:

val gson: Gson = new GsonBuilder()
.registerTypeAdapter(new TypeToken[List[CameraIds]]() {}.getType,
getListOfCameraIdsTypeAdapter)
.create()
val reader: JsonReader = new JsonReader(
new FileReader(configFilePath.toString));
gson.fromJson(reader, classOf[Filter]);

但是,永远不会调用类型适配器的read方法,并且FiltervalidCameraIds始终null。 我在这里错过了什么?

问题是validCameraIds的 case 类变量名称与"cameraIds"的 Json 字符串键中的名称不同。显然,Gson 在解析之前会查看 case 类变量名称。

最新更新