0
votes

Utilisation de Circe pour décoder JSON String

J'ai une chaîne JSON comme xxx pré>

J'ai la classe de cas suivante pour décoder JSON String. P> xxx pré>

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)


2 commentaires

@ 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.


3 Réponses :


2
votes

Vous n'avez pas besoin d'un codec personnalisé. Il suffit de configurer le codec dérivé en utilisant Circe-générique-extras .

donc donné: xxx

Vous pouvez: xxx

et ensuite: xxx


8 commentaires

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 à vos options scalac .


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) est modifié en Type TenantsSettings = Carte [String, String]


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.



1
votes

Circe fournit tous les instances code> Decoder code> dont vous avez besoin, à l'exception de celle des 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>

Voici le code: 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 -> ...


5 commentaires

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] est juste un alias de type et une dérivation n'a aucun sens pour cela. Qu'essayez-vous de faire?



-1
votes

C'est ce que j'ai fait et travaillé pour moi xxx


0 commentaires