6
votes

Manipulation `id` dans les cas d'Aeson dérivé Dijson avec Aeson / Json

Si j'ai JSON et j'essaie de dériver automatiquement les instances fromjson avec génériques , je rencontre des problèmes avec ID < / code> existant dans plus d'un endroit dans le JSON .

Y a-t-il un moyen pour moi de remplacer uniquement la partie ou dois-je écrire toute l'instance afin de modifier ces entrées particulières? Le JSON a effectivement plus de champs, mais j'en ai laissé la majeure partie de cet exemple. Il est donc plutôt fastidieux d'écrire l'instance totale fromjson .

json: xxx

code jusqu'à présent: < / p> xxx

ceci donne l'erreur: xxx

Idéalement, je voudrais changer le premier ID à body_id et le second à taxcode_id sans avoir à écrire toute l'instance.


1 commentaires

Le prochain GHC 8,0 aura une extension Duplicaterecordfields GHC.HASKELL.ORG/TRAC / GHC / Wiki / Records / SurchargéRecordfields / ... qui atténuera ce problème.


3 Réponses :


3
votes

Le problème n'est pas que GHC ne puisse pas fournir de génériques, mais que dans les étiquettes d'enregistrement HASKELLL sont également des fonctions d'accesseur et vous obtenez ainsi un nom Clash si vous essayez d'utiliser la même étiquette pour deux enregistrements différents.

Si Vous utilisez les fonctions de data.aeson.th code> Vous pouvez utiliser l'option fieldlabelmodificateur code> par exemple. Supprimer les préfixes de vos étiquettes. P>

data Identity = Identity
{ identitysku       :: String
, identityean       :: String
, identitybarcode   :: String
} deriving (Show)

$(deriveJSON defaultOptions{fieldLabelModifier = drop (length "identity")} ''Identity)


0 commentaires

12
votes

Lorsque vous dérivez des instances de Dijson, vous pouvez passer une option à la fonction genericparsejson . Il est généralement xxx

pendant que vous pouvez remplacer par défautOptions avec une option vous construit manuellement. L'option type a un champ FieldLabelModifier qui peut pré-traiter le nom de champ de votre type de données. Vous pouvez définir votre type de données comme xxx

et écrire une fonction d'assistant qui mappe "body_id" à "id" " et toute autre chose inchangée: xxx

puis définissez l'instance comme xxx


2 commentaires

Agréable! Je ne savais pas que vous pourriez fournir des options pour les instances génériques.


C'est ce dont j'avais besoin. Merci de votre aide!.



2
votes

D'autres ont donné de grandes façons de modifier les instances générées, ce qui sera parfois la meilleure chose à faire. Ce n'est cependant pas votre seul choix. Vous avez également la possibilité de définir un ou plusieurs types dans des modules distincts, générer des instances dans ces modules, puis importer les modules qualifiés ou autrement à l'aide de noms qualifiés pour se référer aux noms de champs qui se chevauchent.


0 commentaires