Разбор более 22 полей с помощью Spray Json без вложенных классов - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь использовать Spray-JSON для маршалинга входящего JSON с более чем 22 полями.Поскольку метода JsonFormat23 () нет, мне приходится вкладывать свои классы case, чтобы обойти ограничение.Однако входящий JSON не знает о вложенной структуре.

Есть ли способ избежать использования вложенной структуры в Spray Json?

EDIT

Вот мое решение, чтобы другие не испытывали такой же боли.Одной из моих проблем было то, что все мои поля были необязательными, что добавило еще один уровень сложности.В этом решении вы можете указать столько полей, сколько хотите

    implicit object myFormat extends RootJsonFormat[myFormat] {
        override def write(js : myFormat):JsValue =
          JsObject(
            List(
              Some("language" -> js.language.toJson),
              Some("author" -> js.author.toJson),
                ....
            ).flatten: _*
          )

        override def read(json: JsValue):myFormat= {
          val fieldNames = Array("language", ... , "author")

          val jsObject = json.asJsObject
          jsObject.getFields(fieldNames:_*)

          // code to transform fields to case class

          // Initializes class with list of parameters
          myFormat.getClass.getMethods.find(x => x.getName == "apply" && x.isBridge)
            .get.invoke(myFormat, mylist map (_.asInstanceOf[AnyRef]): _*).asInstanceOf[myFormat]

        }
    }

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете реализовать RootJsonFormat, как описано здесь , чтобы обойти ограничения Tupple22 и Function22.В классах case больше нет ограничений на 22 параметров (с предостережениями), поэтому вы можете сохранять структуру классов плоской.Вам даже не нужно использовать класс case в качестве целевого типа десериализации при реализации RootJsonFormat, вместо этого он может быть обычным классом.

Обратите внимание, что даже если вы можете получить JSON-код, проанализированный в классе case,могут быть и другие ограничения 22, с которыми вы можете столкнуться в своем коде.См. это для объяснения.Например, вы получили свой класс case и теперь хотите сохранить его в БД, и ваша структура БД не может обойти ограничение 22 параметров без специального сериализатора.В этом случае преобразование во вложенные классы может быть проще.

В Dotty предел 22 будет полностью пропущен , но это займет некоторое время:

Предел в 22 для максимального количества параметров типов функций был удален.Функции теперь могут иметь произвольное количество параметров.Функции, выходящие за пределы Function22, представлены новой чертой scala.FunctionXXL.

Предел 22 для размера кортежей вот-вот будет удален.В будущем кортежи будут представлены HList-подобной структурой, которая может быть сколь угодно большой.

...