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 № 1Normalnie 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.