Ich habe eine Eigenschaft verwendet, um json Decoder als Abhängigkeit Komponenten meines Projekts zu injizieren:Generisches json Decoder Merkmal mit Circe Implementierung
trait JsonDecoder {
def apply[T](s: String): Option[T]
}
Wenn ich versuche, es zu implementieren mit Circe:
import io.circe.generic.auto._
import io.circe.parser.decode
case class CirceJsonDecoder() extends JsonDecoder {
def apply[T](s: String): Option[T] = {
decode[T](s).fold(_ => None, s => Some(s))
}
}
und laufen:
case class C()
def test(d: JsonDecoder) = d[C]("{}")
test(CirceJsonDecoder())
es nicht mit dem Fehler nicht kompilieren:
could not find implicit value for parameter decoder: io.circe.Decoder[T]
Ich versuchte ClassTag
, TypeTag
oder WeakTypeTag
Kontext Grenzen für T
hinzufügen, aber es kann immer noch nicht impliziten Wert für Decoder
finden.
Ich kann Decoder
Kontext gebundenen oder impliziten Parameter zu JsonDecoder.apply
nicht hinzufügen, da Komponenten, die es verwenden sollten nicht über Implementierungsdetails wissen sollten.
Wie soll ich implizit io.circe.Decoder
bereitstellen? Kann es einen Weg geben, es von TypeTag
zu bekommen?
Von was ich verstehe, wie Sie versucht haben, es zu beheben (Hinzufügen von Reflektion über 'ClassTag' /' TypeTag'), nehmen Sie an, Circe verwendet Reflektion, um die JSON-Codecs abzuleiten. Das ist nicht der Fall. Stattdessen leitet circe die Codecs bei compiletime ab, also benötigt es mehr Informationen als nur "T" über einen Typ. Sie könnten 'shapeless.LabledGeneric' oder' shapless.Generic' Kontext gebunden versuchen. – Reactormonk