/ / Scala wprowadza wartość do domyślnego zakresu bez nazywania go - scala, implicit, spray-json

Scala wprowadza wartość do ukrytego zakresu bez nazywania jej - scala, implicit, spray-json

Podczas używania spray-json, Muszę przynieść JsonFormat[A] w domniemany zakres dla każdego typu domeny A że chcę serializować.

Zalecane podejście polega na utworzeniu niestandardowego obiektu zawierającego wszystkie implicity jako pola:

object MyJsonProtocol extends DefaultJsonProtocol {
implicit val colorFormat = jsonFormat4(Color)
}

import MyJsonProtocol._

Moja aplikacja ma wiele typów domen, z których niektóre mają długie nazwy. Mój MyJsonProtocol jest długi i nieczytelny:

object MyJsonProtocol extends DefaultJsonProtocol {
... // many more here
implicit val someClassWithALongNameFormat = jsonFormat4(SomeClassWithALongName)
implicit val someClassWithALongNameInnerFormat = jsonFormat4(SomeClassWithALongNameInner)
implicit val someClassWithALongNameVariantBFormat = jsonFormat4(SomeClassWithALongNameVariantB)
... // many more here
}

Długie nazwy val mają różne problemy:

  • czują się zbędni (nazwiska nigdy nie są czytane)
  • sprawiają, że moje linie są bardzo długie
  • wprowadzają ryzyko kopiowania / wklejania, że ​​nazwa formatu wygranego "t odpowiada typowi formatu
  • powodują, że wartości RHS nie są wyrównane, co ukrywa tutaj wspólny wzorzec

Czy istnieje sposób na wprowadzenie obiektu w ukryty zakres bez nazywania go? Coś takiego byłoby znacznie bardziej eleganckie:

object MyJsonProtocol extends DefaultJsonProtocol {
... // many more here
implicit val _ = jsonFormat4(SomeClassWithALongName)
implicit val _ = jsonFormat4(SomeClassWithALongNameInner)
implicit val _ = jsonFormat4(SomeClassWithALongNameVariantB)
... // many more here
}

... ale Scala nie zezwala na wiele pól o nazwie "_".

Czy jest jakiś sposób, aby przekształcić te formaty w domyślny zakres bez nazywania ich wszystkich? Czy istnieje inny sposób użycia spray-json, który omija ten problem?

Odpowiedzi:

3 dla odpowiedzi № 1

Normalnie definiuję instancje typu "ty" w obiektach towarzyszących:

case class Foo()
object Foo {
implicit val jsonFormatter = new JsonFormat[Foo] { ... }
}

case class Bar()
object Bar {
implicit val jsonFormatter = new JsonFormat[Bar] { ... }
}

Nie muszę importować niczego, ponieważ obiekty towarzyszące są domyślnie włączone do niejawnego zakresu wyszukiwania, a niejawni członkowie mogą mieć te same nazwy.