Вложенный JSON in scala, Circe, Slick - PullRequest
1 голос
/ 24 февраля 2020

У меня есть вложенный JSON в моей базе данных. Я выяснил, кейс-класс для того же. Я использую Circe, Slick и Akka HTTP в своем веб-приложении API.

Мой класс case:

case class Sen
  (
    sentences: Array[File]
  )

  case class File
  (
    content: String,
  )

Я написал GetResult для той же вложенности. У меня проблемы с массивом в классе case.

 implicit lazy val getFile  = GetResult(r => Array[File](r.<<))
 implicit lazy val SenObj = GetResult(r => Sen(getFile(r)))

Может кто-нибудь сказать мне, как решить эту проблему?

Ниже приведена ошибка, которую я получаю при компиляции

    Error:diverging implicit expansion for type slick.jdbc.GetResult[T]
starting with method createGetTuple22 in object GetResult
  implicit lazy val getFile  = GetResult(r => Array[File](r.<<))

1 Ответ

0 голосов
/ 26 февраля 2020

Ваше определение getFile вручную создает Array, и, в частности, вы запрашиваете Array[File]. Нет GetResult[File], означающего, что r.<< не сможет преобразовать значение столбца в File.

Может кто-нибудь сказать мне, как решить эту проблему?

Вам по крайней мере понадобится GetResult[File], определенный.

Однако из вопроса о том, как должна работать часть JSON, неясно:

  • Возможно, у вас есть столбец, содержащий текст, который ваше приложение рассматривает как JSON. Если это так, я предлагаю сделать JSON преобразование массива вне вашего слоя кода Slick. Это обеспечит прямое сопоставление с базой данных и из нее.

  • Или, возможно, у вас есть тип JSON в вашей базе данных, и вы используете операции с базой данных c. В этом случае, я думаю, это будет зависеть от того, какой у вас там контроль, и, вероятно, имеет смысл попытаться выполнить операции JSON -array на слое Slick. (Это относится к Postgress, например, через библиотеку pg-slick )

Но это другой вопрос.

В целом обратите внимание, я предлагаю всегда четко указывать типы GetResult, которые вы определяете:

implicit lazy val getFile: GetResult[Array[File]]= 
  GetResult(r => Array[File](r.<<))

implicit lazy val SenObj: GetResult[Sen] = 
  GetResult(r => Sen(getFile(r)))

..., чтобы иметь представление о доступных экземплярах. Я считаю, что это помогает в отладке этих ситуаций.

...