Size: a a a

Scala User Group

2020 March 12

ЮБ

Юрий Бадальянц in Scala User Group
Сделал ещё понятнее пример
источник

DM

Daniel Matveev in Scala User Group
Юрий Бадальянц
А можно в tethys заэнкодить sealed family таким образом:
sealed trait A
case class B(b1: String, b2: Int) extends A
case class C(c: Int) extends A

В такой json для B:
{
 "b": {
   "b1": "foo",
   "b2": 56
 }
}

И такой для C:
{
"c": {
  "c": 5
}
}
JsonReader.builder
     .addField[Option[String]]("b1")
     .selectReader[A]{
       case Some(_) => JsonReader[B]
       case None => JsonReader[C]
     }
источник

ЮБ

Юрий Бадальянц in Scala User Group
Так circe-generic по-умолчанию sealed familty кодирует, например
источник

ЮБ

Юрий Бадальянц in Scala User Group
Daniel Matveev
JsonReader.builder
     .addField[Option[String]]("b1")
     .selectReader[A]{
       case Some(_) => JsonReader[B]
       case None => JsonReader[C]
     }
А если больше чем 2 варианта?
источник

DM

Daniel Matveev in Scala User Group
перебирать все, когда нет флага, то других вариантов нет
источник

DM

Daniel Matveev in Scala User Group
лишь бы они точно отличались друг от друга
источник

ЮБ

Юрий Бадальянц in Scala User Group
Daniel Matveev
перебирать все, когда нет флага, то других вариантов нет
А что делать в None случае тогда?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
источник

ЮБ

Юрий Бадальянц in Scala User Group
Вот, например, вот такой код:
sealed trait A
case class B(b1: String, b2: Int) extends A
case class C(c: Int) extends A
case class D(d: Long) extends A
источник

DM

Daniel Matveev in Scala User Group
Юрий Бадальянц
А что делать в None случае тогда?
в теории ты можешь сделать сразу все возможные addField, по которым будешь различать, а дальше разобрать все кейсы одни патматом
источник

ЮБ

Юрий Бадальянц in Scala User Group
Daniel Matveev
в теории ты можешь сделать сразу все возможные addField, по которым будешь различать, а дальше разобрать все кейсы одни патматом
Это как?
источник

ЮБ

Юрий Бадальянц in Scala User Group
Как получить доступ к этим прочитанным полям?
источник

ЮБ

Юрий Бадальянц in Scala User Group
А, я понял. Прочитать всё, а потом из тапла вычитать?
источник

DM

Daniel Matveev in Scala User Group
вся идея в том, что ты смотришь лишь на наличие уникального поля как на флаг, а потом уже передаешь ридер для конкретного класса
источник

DM

Daniel Matveev in Scala User Group
Юрий Бадальянц
А, я понял. Прочитать всё, а потом из тапла вычитать?
да
источник

ЮБ

Юрий Бадальянц in Scala User Group
Спасибо, это помогло
источник

ЮБ

Юрий Бадальянц in Scala User Group
теперь надо writer сделать :)
источник

DD

Denis Dvornikov in Scala User Group
Ребят, а как сказать кейс классу с какими полями он будет маршалиться из json? например underscore или camelCase
источник

AO

Alexey Otts in Scala User Group
Юрий Бадальянц
теперь надо writer сделать :)
Врайтер итак нахаляву через макрос
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Denis Dvornikov
Ребят, а как сказать кейс классу с какими полями он будет маршалиться из json? например underscore или camelCase
в популярных библиотеках есть поддержка этого
источник