Si j'ai Y a-t-il un moyen pour moi de remplacer uniquement la partie code> code> ou dois-je écrire toute l'instance afin de modifier ces entrées particulières? Le json: p> code jusqu'à présent: < / p> ceci donne l'erreur: p> Idéalement, je voudrais changer le premier JSON code> et j'essaie de dériver automatiquement les instances fromjson code> avec génériques code>, je rencontre des problèmes avec ID < / code> existant dans plus d'un endroit dans le JSON code>. JSON code> 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 code>. P> ID code> à body_id code> et le second à taxcode_id code> sans avoir à écrire toute l'instance. p> p>
3 Réponses :
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)
Lorsque vous dérivez des instances de Dijson, vous pouvez passer une option à la fonction pendant que vous pouvez remplacer et écrire une fonction d'assistant qui mappe puis définissez l'instance comme p> genericparsejson code>. Il est généralement par défautOptions code> avec une option code> vous construit manuellement. L'option code> type code> a un champ FieldLabelModifier code> qui peut pré-traiter le nom de champ de votre type de données. Vous pouvez définir votre type de données comme p> "body_id" code> à "id" code> " et toute autre chose inchangée: p>
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!.
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. P>
Le prochain GHC 8,0 aura une extension Duplicaterecordfields GHC.HASKELL.ORG/TRAC / GHC / Wiki / Records / SurchargéRecordfields / ... qui atténuera ce problème.