Адаптер типа Scala Gson не вызывается в списке [перечисление] - PullRequest
0 голосов
/ 12 октября 2018

В 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 адаптера типа никогда не вызывается, а Filter validCameraIds всегда null,Что мне здесь не хватает?

1 Ответ

0 голосов
/ 13 октября 2018

Проблема в том, что имя переменной класса дела validCameraIds отличается от имени в строковом ключе Json "cameraIds".Очевидно, что перед синтаксическим анализом Gson просматривает имена переменных класса case.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...