Разбор более 22 полей с помощью Spray Json без вложенных классов
Я пытаюсь использовать Spray-JSON для маршалинга входящего JSON с более чем 22 полями. Поскольку метода JsonFormat23() нет, мне приходится вкладывать свои классы case, чтобы обойти ограничение. Однако входящий JSON не знает о вложенной структуре.
Есть ли способ избежать использования вложенной структуры в Spray Json?
РЕДАКТИРОВАТЬ
Вот мое решение, чтобы другие не испытывали такой же боли. Одной из моих проблем было то, что все мои поля были необязательными, что добавило еще один уровень сложности. Вы можете поместить столько полей, сколько вы хотите в этом решении
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 ответ
Вы можете реализовать RootJsonFormat
как описано здесь, чтобы обойти Tupple22
а также Function22
ограничения. Там нет предела 22
параметры в случае классов больше (с предостережениями), так что вы можете сохранить свою структуру класса плоской. Вам даже не нужно использовать класс case в качестве целевого типа десериализации при реализации RootJsonFormat
, это может быть обычный класс вместо этого.
Обратите внимание, что даже если вы можете получить JSON-анализ в классе case, могут быть и другие ограничения 22
вы могли бы столкнуться в вашем коде. Смотрите это для объяснения. Например, вы получили свой класс case и теперь хотите сохранить его в БД, а ваша структура БД не может обойтись 22
ограничение параметров без настраиваемого сериализатора. В этом случае преобразование во вложенные классы может быть проще.
В Дотти лимит в 22 полностью исчезнет, но это займет некоторое время:
Предел в 22 для максимального количества параметров типов функций был снят. Функции теперь могут иметь произвольное количество параметров. Функции вне Function22 представлены с новой чертой scala.FunctionXXL.
Предел 22 для размера кортежей вот-вот будет снижен. В будущем кортежи будут представлены HList-подобной структурой, которая может быть сколь угодно большой.