2017-09-08 2 views
0

J'ai une classe de cas scala comme suitComment encoder scala case class en json avec n'importe quel type de paramètre de classe case?

case class Intro(name : String, quality : Any) 

J'utilise la bibliothèque scala circe pour coder cet objet JSON. Le code que j'utilise est

import io.circe._ 
import io.circe.generic.auto._ 
import io.circe.syntax._ 

object Example extends App{ 
     println(Intro("Vikash","something").asJson)  
} 

Il me donne l'erreur suivante lors de la compilation.

could not find implicit value for parameter encoder: io.circe.Encoder[com.xxx.Intro] 

Si je change le type d'attribut de classe de cas quality taper String il fonctionne très bien.

Comment coder la classe de cas avec Any type dans l'attribut

Merci

Répondre

1

Votre problème est lié au fait que vous utilisez la génération de codec automatique, ce qui est la compilation entièrement le temps, la valeur ainsi donnée de type Tous il est pratiquement impossible de générer un codec pour cela. Vous devriez être en mesure de résoudre ce problème en l'une des choses suivantes:

  1. utilisation générique au lieu de Tous, vous devez vous assurer qu'il existe une instance de codeur et classe de type décodeur pour le type que vous utilisez. Votre classe devrait ressembler à ceci: case class Intro[T](name: String, quality: T). De cette façon vous pouvez utiliser Intro [String], Intro [Int] etc.
  2. Fournissez votre propre instance de Encoder/Decoder pour le type Any, ce qui serait assez difficile à réaliser et pour moi c'est plutôt une mauvaise idée.

Si vous ne connaissez pas les classes de types ou la façon dont la résolution implicite fonctionne, vous devez d'abord en apprendre davantage à leur sujet.