2016-07-11 4 views
0

Ich habe Probleme beim Hinzufügen eines implizit definierten Typkonverters für einen Typ, für den ich auch ein Json-Format habe. Ich bezweifle, ob das Problem etwas mit Json (oder Spray) zu tun hat. Oder MyDate für diese Angelegenheit.Begleitobjekte, implicits und Json

Hier ist ein Code-Fragment, das für das Problem führt Ich erlebe:

case class MyDate(y: Int, m: Int, d: Int) 
object JsonProblem extends App { 
import spray.json.{DefaultJsonProtocol, _} 
object MyJsonProtocol extends DefaultJsonProtocol with NullOptions { 
    implicit val myDateFormat = jsonFormat3(MyDate) 
} 
import MyJsonProtocol._ 
val exampleDate = """{ "y": 2016, "m": 7, "d": 11 }""" 
val y: MyDate = exampleDate.parseJson.convertTo[MyDate] 
} 

Bisher funktioniert alles wie erwartet. Der Wert y nimmt die entsprechende Instanz von MyDate.

Jetzt, nach der Fall Klassendefinition (obwohl ich nicht glaube, es wichtig ist, wo ich diesen Code zu setzen), stelle ich einen Begleiter Objekt so:

object MyDate { 
    implicit def convertMyDateToInt(x: MyDate): Int = ??? 
} 

sofort, erhalte ich einen Compiler-Fehler auf der myDateFormat Zeile: * kann jsonFormat3 mit solcher Signatur * nicht auflösen. Der Zweck meines zusätzlichen Codes ist (aus meiner Sicht) nicht verwandt mit dem Json-Parsing. Es ist, weil in einem anderen Teil des Codes möchte ich implizit MyDate in Int konvertieren.

Ich erwarte, dass es mit der Tatsache zu tun hat, dass ich ein compiler-generiertes Companion-Objekt durch mein eigenes ersetze (oder erweitere). Aber was genau ist das Problem und wie kann ich es umgehen?

Antwort

2

einfach die Begleiter verwenden Objekte Funktion

import spray.json._ 

case class MyDate(y: Int, m: Int, d: Int) 

object MyDate { 
    implicit def convertMyDateToInt(x: MyDate): Int = ??? 
} 

object JsonProblem extends App { 
    object MyJsonProtocol extends DefaultJsonProtocol with NullOptions { 
    implicit val myDateFormat:RootJsonFormat[MyDate] = jsonFormat3(MyDate.apply) 
    } 
    import MyJsonProtocol._ 
    val exampleDate = """{ "y": 2016, "m": 7, "d": 11 }""" 
    val y: MyDate = exampleDate.parseJson.convertTo[MyDate] 
} 
+0

Dank gelten, dachte ich an, dass sein sollen! – Phasmid