2016-12-23 3 views
2

Ich habe das in json4s geschrieben folgenden Code, und arbeitetMigration für Json4S zu Circe

fein kompiliert
import org.json4s._ 
def jsonRead[T <: AnyRef](input: String)(implicit m: Manifest[T]): T = { 
    Try(read[T](input)).get 
} 

def jsonWrite[T <: AnyRef](input: T)(implicit m: Manifest[T]): String = { 
    write[T](input).toString 
} 

ich folgende Circe Code geschrieben haben

import io.circe._ 
import io.circe.syntax._ 
import io.circe.generic.auto._ 
import io.circe.parser.decode 
def unmarshall[T <: AnyRef](input: String)(implicit m: Manifest[T]) : T ={ 
    decode[T](input).right.get 
} 
def marshall[T <: AnyRef](input: T)(implicit m: Manifest[T]) : String = { 
    input.asJson.toString 
} 

aber ich habe den Fehler

Error:(27, 16) could not find implicit value for parameter decoder: io.circe.Decoder[T] decode[T](json).right.get 
Error:(27, 16) not enough arguments for method decode: (implicit decoder: io.circe.Decoder[T])Either[io.circe.Error,T]. Unspecified value parameter decoder. decode[T](json).right.get 
Error:(30, 11) could not find implicit value for parameter encoder: io.circe.Encoder[T] obj.asJson.toString 
Error:(30, 11) not enough arguments for method asJson: (implicit encoder: io.circe.Encoder[T])io.circe.Json. Unspecified value parameter encoder. obj.asJson.toString 

Antwort

5

json4s und circe sind verschiedene Bibliotheken, die in verschiedenen Arbeits Wege und deshalb können Sie nicht die gleiche Technik verwenden. Während json4sread ein Manifest muss einen Wert von Json zu extrahieren, erfordert circe eine Instanz des typeclass Decoder. Wenn Sie circe in Ihrem Beispiel verwenden möchten, sollten Sie so etwas wie

def unmarshall[T <: AnyRef](input: String)(implicit d: Decoder[T]) : T = { 
    decode[T](input).right.get 
} 
def marshall[T <: AnyRef](input: T)(implicit e: Encoder[T]) : String = { 
    input.asJson.toString 
} 

schreiben Um die Unterschiede zu verstehen, schlage ich vor, sowohl die Umsetzung zu lesen, sind sie sehr nützlich, um zu verstehen, wie die beiden Bibliotheken zu tun, was sie tun. Sie können die Unterschiede bereits in den Unterschriften von json4s nativen read und Circe decode sehen. Ich werde hier die wichtigen Bits der Signaturen kopieren, um den grundlegenden Unterschied zwischen den beiden Bibliotheken zu erklären. Die Unterschrift des json4s nativen read ist

def read[A](input: String)(implicit mf: Manifest[A]): A 

die als interpretiert werden kann „Ich habe einen String in jede Art A umwandeln kann, wenn Sie ein Scala Manifest für sie zur Verfügung stellen“. Da Manifest ein Scala Merkmal für die Reflexion verwendet wird, können Sie ableiten, dass read Reflexion verwenden.

Die Signatur von circe decode ist anders:

def decode[A](input: String)(implicit d: Decoder[A]): Either[Error, A] 

, die als gelesen werden kann: „Ich kann versuchen, einen String in einen Typ A zu konvertieren, wenn Sie eine Circe Decode Beispiel dafür liefern“. Die Decoder typeclass sagt nur das System, wie einen Wert vom Typ dekodieren A von json.