Невозможно десериализовать json в класс case с помощью gson - PullRequest
0 голосов
/ 18 июня 2020

Я работаю на языке программирования Scala и хочу десериализовать json в класс case

Мой класс case выглядит так

case class Events
(
  Name: String,
  Field1: Option[Seq[String]],
  Field2: Option[Seq[String]],
  Field3: Option[Seq[String]]
)

case class RootInterface
(
  Events: Seq[Events]
)

json выглядит так

"Events": [
    {
      "Name": "event1",
      "Field1": ["f1"]
    },
    {
      "Name": "event2",
      "Field1": ["f1","f2"]
    }
  ]

И код, который я должен сделать, это

val gson = new Gson

gson.fromJson(json, classOf[RootInterface])

, когда я пытаюсь сделать это, я получаю следующую ошибку:

java .lang. RuntimeException: невозможно вызвать конструктор без аргументов для scala .collection.Seq <***. Events>. Зарегистрируйте InstanceCreator в Gson, поскольку этот тип может решить эту проблему.

Как я могу это исправить?

1 Ответ

1 голос
/ 18 июня 2020

Вы не сможете использовать Java библиотеки, ожидающие Java Beans со стандартными классами case

  • у вас нет конструктора no-artgs (вам нужно будет создать конструктор по умолчанию)
  • у вас есть только сеттеры (вы не использовали var s)
  • , а аксессоры не используют синтаксис Bean (вам нужно будет использовать @BeanProperty)

Таким образом, вам придется использовать что-то вроде:

case class Events(
  @BeanProperty var name: String,
  @BeanProperty var field1: Option[Seq[String]],
  @BeanProperty var field2: Option[Seq[String]],
  @BeanProperty var field3: Option[Seq[String]]
) {

  def this() = this("", None, None, None)
}

, но это означает, что библиотека использует отражение во время выполнения, которое бросает безопасность типов под шину. Лично я не вижу причин использовать библиотеки Java JSON, если у вас есть выбор, потому что у меня есть отражение времени компиляции в библиотеках Scala.

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