J'ai une chaîne JSON comme J'ai la classe de cas suivante pour décoder JSON String. P> aussi, fournisseurs La classe ci-dessus est facultative, elle peut être présente ou non dans la chaîne JSON. p> Je veux décoder cela à l'aide de Circe sur P> val value = decode[Map[String, TenantSettings]](configInfo)
3 Réponses :
Vous n'avez pas besoin d'un codec personnalisé. Il suffit de configurer le codec dérivé en utilisant Circe-générique-extras fort > .
donc donné: p> Vous pouvez: p> et ensuite: p>
Je reçois l'erreur suivante n'a pas pu trouver la valeur implicite paresseuse de type io.circe.generic.extras.decoding.contras.decoding.configuredDecoder [a] [Erreur] [Erreur] Implicit Final Val DecodeCodeTenantsTênesSETTENSETTENINTES: DÉCODER [TELANTATIONS] = DERIVECONFIGUTEDDECODER J'ai Wartonover dans mon projet qui a attrapé ce problème
@Arjunkarnwal si vous le désactivez? Le code compile-t-il? BTW, essayez d'ajouter -Ywarn-macros: après code> à vos options scalac b>.
En fait, je me trompe. La verrue n'est pas activée mais je reçois toujours cette erreur. :(
@Arjunkarnwal est votre code différent de celui de la question et êtes-vous sûr de faire tout ce que j'ai fait dans ma réponse? Aussi, quelle version Scala et la version Circe utilisez-vous?
Scala version 2.13 et Circe 0.13.0
Oui en fait, j'ai fait un changement. Classe de cas finale Tenantingsettings (demandeurs: map [String, String], Fournisseur: Carte [String, String] = Carte.empty) Plan [String, String] = Carte.empty) code> est modifié en
Type TenantsSettings = Carte [String, String] Code>
Si je passe du type à la classe de cas, je ne vois pas cette erreur.
@Arjunkarnwal Eh bien, ce code a été fait pour une classe de cas non pour une carte ... Si votre problème est différent, veuillez ouvrir une nouvelle question.
Circe fournit tous les instances code> Decoder code> dont vous avez besoin, à l'exception de celle des Voici le code: p> Tenantsanttings code> car c'est un type personnalisé.
mappe code> et
String code> ne sont pas un problème.
Circe-generic-extras code> ou
CIRCE-Derivation code> est très utile Pour générer des CODE> Decoder CODE> des cas pour les classes de cas. Dans ce cas, vous souhaitez activer les "valeurs par défaut" dans la configuration, de sorte qu'il redevient la carte vide au lieu d'échouer. P>
// you need circe-core, circe-parser and circe-generic-extras as dependencies
import io.circe._
import io.circe.parser.decode
import io.circe.generic.extras.Configuration
import io.circe.generic.extras.semiauto._
val configInfo = """{
"car": {
"requesters": {
"request1": "key1",
"request2": "key2"
},
"provider": {
"request1": "key3",
"request2": "key4"
}
},
"truck": {
"requesters": {
"request1": "key2",
"request2": "key3"
},
"provider": {
"request1": "key2",
"request2": "key3"
}
}
}
"""
final case class TenantSettings(
requesters: Map[String, String],
provider: Map[String, String] = Map.empty
)
object TenantSettings {
implicit private val derivationConfig: Configuration = Configuration.default.withDefaults
implicit val decodeTenantSettings: Decoder[TenantSettings] = deriveConfiguredDecoder
}
val value = decode[Map[String, TenantSettings]](configInfo)
println(value) // Right(Map(car -> TenantSettings(Map(request1 -> key1, request2 -> ...
Je reçois l'erreur suivante n'a pas pu trouver la valeur implicite paresseuse de type io.circe.generic.extras.decoding.contras.decoding.configuredDecoder [a] [Erreur] [Erreur] Implicit Final Val DecodeCodeTenantsTênesSETTENSETTENINTES: DÉCODER [TELANTATIONS] = DERIVECONFIGUTEDDECODER J'ai Wartonover dans mon projet qui a attrapé ce problème
Si vous utilisez des types de classe de cas qui n'ont pas d'instance de décodeur dans la portée de la dérivation (ce qui est bon). Malheureusement, le message d'erreur ne peut pas vous dire exactement quel type est le problème, mais il est généralement facile de repérer. Vous avez probablement ajouté quelque chose qui n'a pas de décodeur.
Vous pouvez également utiliser "Circe-Derivation" au lieu de "Circe-Generic" qui fait la même chose, mais devrait avoir de meilleurs messages d'erreur.
Oui en fait, j'ai fait un changement. Classe de cas finale Ténanteurs (demandeurs: map [String, String], Fournisseur: Carte [String, String] = Carte.empty) Plan [String, String] = Carte.empty) est modifié en Type TenantSettings = Carte [String, String] Donc, lorsque je mets de type au lieu de la classe de cas, il échoue bien que j'ai un décodeur pour le type. Pouvez-vous me dire le problème?
Type TenantsSettings = Carte [String, String] Code> est juste un alias de type et une dérivation n'a aucun sens pour cela. Qu'essayez-vous de faire?
C'est ce que j'ai fait et travaillé pour moi
@ Luismiguelmejíasuárez j'ai corrigé le code
@ Luismiguelmejíasuárez Je suis coincé avec l'écriture de code personnalisé aussi depuis sa carte depuis la carte. Je ne sais pas comment procéder.